好的,所以我有3级车辆继承树。叶子类(树下的最后一个)是六个。我想创建一个将从.txt文件中读取的函数,然后将信息分配给不同的变量(例如,该文件将包含2006 Toyota Supra Diesel,这些将分配给year
,brand
,model
,fuel_type
)。实际上我设法做到了这一点,但之后当我将代码分成.h和.cpp文件时,函数停止工作。
void Cars::txt_input()
{
getline(file,input); //This is in the .cpp file for one of the
year = atoi(input.c_str()); //child classes.
getline(file,input);
brand = input;
getline(file,input);
model = input;
getline(file,input);
passenger_capacity = atoi(input.c_str());
getline(file,input);
engine_power = atoi(input.c_str());
getline(file,input);
max_speed = atoi(input.c_str());
getline(file,input);
fuel_type = input;
getline(file,input);
wheel_drive = input;
getline(file,input);
average_cons = atoi(input.c_str());
getline(file,input);
number_doors = atoi(input.c_str());
getline(file,input);
cType = input;
getline(file,input);
price = atoi(input.c_str());
}
在我的main()中,我声明了ifstream file("vehicles.txt")
和string input
,在分割代码之前工作正常。另外,我创建了ifstream file
和string input
变量作为基类的受保护成员,否则它不会编译,因为它没有找到任何文件和输入变量来处理。但是,现在似乎该函数根本不接受来自main()
的变量,只是填充所有对象' 0或N / A的字段(根据构造函数。)
for (int i = 0; i < 11; i++)
{
if(i<4)
vehicles.push_back(new Cars());
vehicles[vehicles.size()-1]->txt_input();
}
if(i==4 || i==5)
{
vehicles.push_back(new Bus());
vehicles[vehicles.size()-1]->txt_input();
}
//...
}
这就是我在main()
中创建对象的方法。正如我所说,当我在Main.cpp中拥有所有代码时,它工作得很好。此外,我尝试将(ifstream file,string input)
作为参数传递给txt_input()
函数,但它产生错误C2248。这是我的第一篇帖子,对不起,如果有任何歧义。如果需要,我会提供更多代码/信息。
class Vehicles
{
public:
Vehicles();
virtual void txt_input();
virtual void user_input();
virtual void output();
void red_output();
int getPC();
int getPrice();
string getBrand();
void open_file();
protected:
string brand, model, type;
int year, passenger_capacity, price;
double engine_power, max_speed;
ifstream file;
string input;
};
这是父类。
答案 0 :(得分:0)
您已在file
中设置变量main
,但使用名为file
的成员变量,该变量未设置为vehicles.txt
。一种方法是使构造函数将文件名作为参数。
E.g。代码 - 未编译 构造
Cars::Cars(const ifstream& if)
: file(if)
{
}
将其添加到矢量时
vehicles.push_back(new Cars(file)); // this is the file defined in main set to "vehicles.txt"
注意:在命名类成员变量(例如mFile,m_file,_file)时使用约定以避免混淆。
答案 1 :(得分:0)
因此,根据评论,问题是您的变量file
现在是Vehicles
的成员,与您之前的ifstream无关...
以下内容可能有所帮助:
/*virtual*/ void Vehicles::txt_input(std::istream& file)
{
std::string input;
getline(file, input);
year = atoi(input.c_str());
getline(file, input);
brand = input;
// And so on...
}
所以你的循环变成了:
std::ifstream file("vehicles.txt");
for (int i = 0; i != 4; i++) {
Cars* cars = new Cars();
cars->txt_input(file);
vehicles.push_back(cars);
}
for (int i = 0; i != 2; i++) {
Bus* bus = new Bus();
bus->txt_input(file);
vehicles.push_back(bus);
}