C++ 使用头文件和cpp';从文件读取;s

C++ 使用头文件和cpp';从文件读取;s,c++,ifstream,C++,Ifstream,好的,我有一个3级的车辆继承树。叶类(树的最后一个)有六个。我想创建一个函数,从.txt文件读取信息,然后将信息分配给不同的变量(例如,该文件将包含2006丰田Supra Diesel,这些变量将分配给年份,品牌,型号,燃油类型)。实际上,我成功地做到了这一点,但后来当我将代码拆分为.h和.cpp文件时,函数停止工作 void Cars::txt_input() { getline(file,input); //This is in the .cpp file for

好的,我有一个3级的车辆继承树。叶类(树的最后一个)有六个。我想创建一个函数,从.txt文件读取信息,然后将信息分配给不同的变量(例如,该文件将包含2006丰田Supra Diesel,这些变量将分配给
年份
品牌
型号
燃油类型
)。实际上,我成功地做到了这一点,但后来当我将代码拆分为.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文件(“vehicles.txt”)
string input
,它们在拆分代码之前工作正常。另外,我已经创建了
ifstream文件
string input
变量作为基类的受保护成员,否则它将无法编译,因为它找不到任何可使用的文件和输入变量。但是,现在函数似乎根本不从
main()
获取变量,而是用0或N/A(根据构造函数)填充所有对象的字段


这是父类。

您在
main
中设置了变量
file
,但使用了名为
file
的成员变量,该变量未设置为
vehicles.txt
。一种方法是使构造函数将文件名作为参数

例如,代码-未编译 建造师

Cars::Cars(const-ifstream&if)
:文件(如果有)
{
}

将其添加到向量时
车辆。推回(新车(文件));//这是main中定义的文件,设置为“vehicles.txt”


注意:在命名类成员变量(例如mFile、m_文件、_文件)时使用约定,以避免混淆。

因此,根据注释,问题在于,您的变量
文件
现在是
车辆的成员
与主系统中以前的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);
}

在哪里定义了
文件
输入
?它们是
Cars
或globals的成员吗?您的ifstream文件在哪里声明和定义,以及如何声明和定义?一个更干净的设置是将输入流传递给txt_输入函数。@Jarod42文件和输入在基类中定义。对不起,我刚刚编辑了文章。@heinrichj ifstream文件仅在基类中声明。我如何将流传递给txt_输入函数?当我尝试时,正如我所说,它给了我一个C2248。另外,ifstream文件只是声明的,它实际上并没有打开一个文件。txt_输入在基类中声明为虚拟的吗?“文件”成员是如何初始化的?如果您显示基类和一个具体类的完整代码,可能会更容易…是的,方法是完整的。当一切都在Main.cpp中时,我有了这个函数,并且全局定义了ifstream文件(“vehicles.txt”)和字符串输入。然后,正如您所看到的,在for循环期间,不同的对象被推入到向量中,它们的txt_input()函数被执行。但是,当我将代码拆分为cpp和头时,函数似乎只是在继承树本身中寻找这样的变量。这就是我在基类ifstream文件中定义的原因;和字符串输入;仅此而已,“车辆”类是“陆地”、“海洋”和“空中”的父类。“土地”是“汽车”“公共汽车”的母体。“海”是“游轮”“游艇”“航空”是“飞机”“直升机”的母公司“。向我们展示基类定义和初始化
文件的代码非常重要。您还可以检查
getline
设置的任何错误,以了解正在发生的情况。感谢您的帮助。我将在将来研究命名约定。是的,伙计,就是这样。非常感谢。只是一些简单的问题:1.为什么我们要将其作为istream而不是ifstream传递(比如变量类型)?2.为什么我们必须通过引用来传递它?
istream
更通用,因此,例如,您可以传递
std::cin
/*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);
}