Lỗi khi tạo file stream là thành phần của class
Em đang tạo 1 class để đọc file input trong project. Vấn đề là nếu tạo theo kiểu:
class ReadData{
private: std::fstream StudentDB("studentdb.csv");
};
thì trình dịch báo lỗi ở “studentdb.csv”: expected a type specifier.
Em có tìm hiểu qua stack over flow thì được biết do thằng trình dịch nó hiểu StudentDB lúc đó là 1 hàm với tham số truyền vào là “studentdb.csv”, mà đã là tham số truyền vào hàm thì phải xác định kiểu.
Sau đó em chỉ tạo filestream mà chưa xác định file:
// in “ReadData.h”
class ReadData{
private: std::fstream StudentDB();
};
và dùng phương thức open của fstream trong hàm khởi tạo như sau
// in “ReadData.cpp”
ReadData::ReadData() {
StudentDB().open("studentdb.csv");
}
};
nếu làm theo kiểu này thì lúc link lại bị lỗi:
Error LNK2019 unresolved external symbol "private: class std::basic_fstream<char,struct std::char_traits<char> > __thiscall ReadData::StudentDB(void)" (?StudentDB@ReadData@@AAE?AV?$basic_fstream@DU?$char_traits@D@std@@@std@@XZ) referenced in function "public: __thiscall ReadData::ReadData()" (??0ReadData@@QAE@H@Z) TuyenSinhBK E:ProjectsVisual StudioTuyenSinhBKTuyenSinhBKReadData.obj
mọi người quen thao tác với file cho em hỏi trường hợp này phải xử lý thế nào ạ.
Tiện thể em góp ý với anh @ltd là lúc đang lập topic, em gõ nhầm vào phím nào đấy thế là trình duyệt thẳng tay back lại, và mất hết những cái đang gõ dỡ, vì vậy anh có thể tránh điều này cho mọi người theo kiểu mà facebook vẫn làm, là nếu đang gõ dở cmt, hoặc bài đăng, nếu có điều hướng sẽ xuất hiện alert để xác nhận việc điều hướng sẽ bỏ qua mấy cái đang gõ.
Em cảm ơn ạ.
đây là lúc khai báo hàm, đáng ra bạn phải đặt kiểu dữ liệu vào đây ví dụ như ở đây là char* fileName vào thay cho cái “studentdb.csv” thì bạn lại truyền dữ liệu vào lúc khai báo thì đương nhiên là báo lỗi rồi. còn TH 2 thì bạn truyền sai tham số vào thì đương nhiên là lỗi rồi, vì trình dịch đâu tìm được hàm nhận tham số mà bạn truyền vào đâu.
unresolved external symbol -> không tìm thấy hàm/biến …
đây là khởi tạo 1 file stream đến file “studentdb.csv” mà, cái này cũng tương tự như bạn có 1 hàm nguyento() để kiểm tra số nguyên tố, truyền vào 1 số nguyên, khi bạn gọi hàm đấy thì đâu cần phải gọi là nguyento(int 7) đâu.
thế đây k phải là lúc khai báo à, có từ khóa private rồi thì làm gì phải là gọi tới nữa bạn, mà là đang khai báo hàm rồi
ở đây là gọi phương thức khởi tạo của thằng fstream bạn ạ
phương thức khởi tạo của thằng fstream, và truyền vào là đường dẫn tới file
xin thưa với bạn là ở chỗ đó là bạn đang khai báo 1 hàm gì khỉ gì đấy với mục đích sẽ khởi tạo 1 fstream ở file .h, và xin thưa với bạn là 1 method có dùng từ khóa private/protected/public ở đầu là đang ở trạng thái khai báo, implement chứ k phải ở trạng thái được gọi tới. Bạn nên xem lại sửa thành kiểu dữ liệu + tên biến là hết lỗi
thế theo bạn nếu làm thế này:
thì nó là cái gì, và có hợp lệ không :))
fstream khi dùng method open phải có thêm 1 tham số
StudentDB().open("studentdb.csv",ios::in);
http://www.cplusplus.com/reference/fstream/fstream/open/
Thôi, mình nói vậy thôi, bạn muốn làm theo hay k thì tùy. Cái sai cơ bản vậy vẫn k chịu nhìn ra.
Nhân thể mình tặng bạn cái thông báo lỗi:
expected identifier before numeric constant
int myNumber(3);
bạn đang hiểu nhầm rồi, cái mà mình đang làm trên kia là khởi tạo 1 file stream làm 1 member của class, chứ không phải là khai báo hàm gì cả. Khi khởi tạo thì kiểu gì chả phải gọi đến hàm, ví dụ như khai báo:
thì cũng là đang gọi đến 1 hàm của class. giống như mình trên kia
cái fstream ở đây giống như cái int ở kia, và StudentDB là cái mà mình cần khởi tạo, giống như myNumber ở kia, và tham số “studentdb.csv” giống như số 3 ở kia
vậy mục đích của bạn có hoàn thành được không mà cứ cố bảo thủ làm gì.
bạn dịch bằng cái gì mà lại bảo cái này lỗi
tặng bạn cái này để hiểu hơn
http://windybook.com/class-trong-lap-trinh-c-plus-plus-phan-3/
tuy mình k làm về c++, mình dùng java, nhưng bản chất lập trình vẫn như nhau. cái sai của bạn là quá rõ, bạn có hỏi ai cũng vẫn có kết quả như nhau thôi
“studentdb.csv”: expected a type specifier. - > k tìm thấy kiểu dữ liệu.
bạn cố cãi vậy thì mình chịu rồi, hãy nhìn vào cái ví dụ khởi tạo biến kiểu nguyên ở trên sẽ thấy.
cảm ơn bạn góp ý, tham số của hàm đó là tùy chọn, có thể chỉ có 1 tham số là file thôi cũng được, mình cũng đã thử thêm vào nhưng vẫn lỗi cũ.
bạn làm sai thì mình nói sai thôi, bạn có thể liên hệ với @ltd để biết rõ hơn cái sai cơ bản của mình. Code của bạn k chạy được tức là sai, đó là chân lí, chứ k phải cái này chạy đc mà cái kia k chạy được thì nó vẫn đúng cả
mình cũng đang chờ người sâu về C++ để hỏi đây mà :))
mà cũng không hiểu sao bạn lại nhầm lẫn giữa việc khai báo 1 hàm, với việc khai báo 1 thành phần của class sử dụng hàm khởi tạo của class của nó được
bạn tạo object hay method ở đây?
Bạn có hiểu không bạn hỏi kiểu gì vậy?
mình tạo attribute bạn ạ
test giùm mình đoạn code ở trên