Lỗi khi tạo file stream là thành phần của class

test giùm mình đoạn code ở trên :grinning:

Thử cách này:

class ReadData{
 private:
 std::fstream file_me{"hello.c"};
};

mình muốn cái file stream trỏ đến file “studentdb.csv” như là 1 thành viên của lớp này, vì cái stream này dùng trong các hàm khác nữa

mình test rồi mới phản hồi mà.

bạn dùng trình dịch gì vậy, có thể là do khác trình dịch

mình dùng VS2013
bạn nói là muốn dùng stream này trong các hàm khác thì mình nghĩ vẫn dùng được chứ? code ở trên đã cho studentDB trỏ đến file studentdb.csv, bạn chỉ cần đọc db trong file thôi

nó báo lỗi lúc link bạn ạ, khai báo trực tiếp thì nó hiểu nhầm là hàm, còn dùng .open trong hàm khởi tạo thì lúc code xong nó không báo lỗi, nhưng build thì báo lỗi link như mình nói ở trên đấy.

Không biết IDE của bạn bị gì, nhưng mình test thử thì mình vẫn đọc được thông tin trong studentdb.csv

đây là code trong 2 file của mình http://codepad.org/rM3I5Kl9
thực sự cái lỗi lúc link này mình thấy chuối thật, nếu là lỗi ở cú pháp thì còn dễ tìm

private:
	std::fstream StdDB();
	std::fstream AspDB();
	int studentID; //student's ID in class list, stipulate for lines will be read

Theo mình hiểu thì đoạn này bạn khai báo attribute của class. Nếu đúng như vậy tại sao bạn lại cho dấu đóng mở ngoặc vào ()?
Vì nếu bạn cho dấu () vào thì C++ hiểu rằng là bạn đang khai báo hàm (method) chư không phải biến. Bạn nên đọc lại cách khái báo biến và hàm trong C++.

Bạn sửa lại

 private:
	std::fstream StdDB;
	std::fstream AspDB;


StdDB.open(“csdl-bk.csv”, std::ios::in);
AspDB.open(“dangkynv-bk.csv”);

có chỗ thế này mà mình không biết lý do tại sao bạn để như vậy. Đối chiếu với code trong codepad nhé.
Ở dòng 8 và 9. tại sao lại khai báo một hàm mà không định nghĩa nó?
Lúc mình build thử code bạn đưa thì nhận được 2 lỗi như sau

1>ReadData.obj : error LNK2019: unresolved external symbol "private: class std::basic_fstream<char,struct std::char_traits<char> > __thiscall ReadData::StdDB(void)" (?StdDB@ReadData@@AAE?AV?$basic_fstream@DU?$char_traits@D@std@@@std@@XZ) referenced in function "public: __thiscall ReadData::ReadData(int)" (??0ReadData@@QAE@H@Z)
1>ReadData.obj : error LNK2019: unresolved external symbol "private: class std::basic_fstream<char,struct std::char_traits<char> > __thiscall ReadData::AspDB(void)" (?AspDB@ReadData@@AAE?AV?$basic_fstream@DU?$char_traits@D@std@@@std@@XZ) referenced in function "public: __thiscall ReadData::ReadData(int)" (??0ReadData@@QAE@H@Z)

thì 2 lỗi này là do linker không tìm thấy phần định nghĩa

cảm ơn bạn, mình sửa lại vậy thì khi dùng phương thức open trong constructor nó lại báo:

left of .open must have class/struct/union
ReadData::ReadData(int id)
{
	studentID = id;
	StdDB.open("csdl-bk.csv", std::ios::in);
	AspDB.open("dangkynv-bk.csv",std::ios::in);
	if (!StdDB.good() || !AspDB.good())
	{
		std::cout << "input files do not exist" << std::endl;
		system("pause");
		system("exist");
	}
}

do bạn sửa còn sót lại vài chỗ nên nó vẫn hiểu là hàm, return cho lvalue một giá trị

trên codepad là mình đã xóa 1 số cái không liên quan rồi, thực sự cũng thấy lạ, nếu nó không phải là class mà khai báo trong hàm main thì khai báo thẳng:

fstream StudentDB("studentdb.csv");

không vấn đề gì cả.
Hoặc khai báo

fstream StudentDB;
StudentDB.open("studentdb.csv");

thì dùng lại rất bình thường


There is no object being introduced

vì C++ ko cho phép khởi tạo các thuộc tính của class khi khai báo các thuộc tính này.

fstream StudentDB("studentdb.csv");
dòng lệnh này là khai báo biến StudentDB khởi tạo biến StudentDB (mở file studentdb.csv).

Ở trong hàm hay phương thức (hàm trong class được gọi là phương thức) thì có thể khai báo và khởi tạo biến cùng lúc thoải mái, nhưng khi khai báo thuộc tính (biến trong class được gọi là thuộc tính) trong class thì chỉ được khai báo biến thôi, ko được khởi tạo tụi nó. Khởi tạo tụi nó là nhiệm vụ của constructors.

C++ 11 thì khởi tạo giá trị được luôn mà, mình dùng VS 2015

Bạn cho mình xem thử một đoạn code thử xem

từ C++ 11 cho phép khởi tạo giá trị luôn bạn ạ. Mình cũng đã chuyển sang 1 cách khác là không khởi tạo ngay, mà khởi tạo trong constructor, nhưng lỗi như trên đó

ko khởi tạo ngay thì khác gì khai báo như C++ bình thường… tội gì phải để () trống không làm compiler nó tưởng đó là 1 phương thức thay vì thuộc tính.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?