30/09/2018, 18:59

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 ạ.

Quân viết 21:09 ngày 30/09/2018

private: std::fstream StudentDB(“studentdb.csv”);

đâ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 …

nohat viết 21:03 ngày 30/09/2018

đâ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.

Quân viết 21:10 ngày 30/09/2018

class ReadData{
private: std::fstream StudentDB(“studentdb.csv”);
};

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

nohat viết 21:02 ngày 30/09/2018

ở đây là gọi phương thức khởi tạo của thằng fstream bạn ạ

nohat viết 21:13 ngày 30/09/2018

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

Quân viết 21:11 ngày 30/09/2018

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

nohat viết 21:14 ngày 30/09/2018

thế theo bạn nếu làm thế này:

class Demo{
 private:
  int myNumber(3);
};

thì nó là cái gì, và có hợp lệ không :))

Minh Hoàng viết 21:15 ngày 30/09/2018

StudentDB().open(“studentdb.csv”);

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/

Quân viết 21:06 ngày 30/09/2018

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);

nohat viết 21:14 ngày 30/09/2018

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:

private:
int myNumber = 3;
//tương đương với:
int yourNumber(3);

thì cũng là đang gọi đến 1 hàm của class. giống như mình trên kia

private
std::fstream StudentDB("studentdb.csv");

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

Quân viết 21:06 ngày 30/09/2018

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ì.

nohat viết 21:06 ngày 30/09/2018

bạn dịch bằng cái gì mà lại bảo cái này lỗi

#include <iostream>

//using namespace std;

int main(int argc, char* argv[])
{
	int myNumber(3);
	std::cout << myNumber << std::endl;
	return 0;
}
Quân viết 21:03 ngày 30/09/2018

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.

nohat viết 21:02 ngày 30/09/2018

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.

nohat viết 21:04 ngày 30/09/2018

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ũ.

Quân viết 21:03 ngày 30/09/2018

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ả

nohat viết 21:00 ngày 30/09/2018

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

Minh Hoàng viết 21:05 ngày 30/09/2018

class ReadData{
private: std::fstream StudentDB();
};

bạn tạo object hay method ở đây?

#pragma once
#include "fstream"
using namespace std;
class ReadData
{
private:
	fstream StudentDB;
public:
	ReadData(){StudentDB.open("studentdb.csv", ios::in);}
	~ReadData();
};

Bạn có hiểu không bạn hỏi kiểu gì vậy?

nohat viết 21:14 ngày 30/09/2018

mình tạo attribute bạn ạ

Minh Hoàng viết 21:09 ngày 30/09/2018

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

Bài liên quan
0