C++ 指向派生类对象的指针存储在指向基类对象的指针向量中

C++ 指向派生类对象的指针存储在指向基类对象的指针向量中,c++,inheritance,vector,C++,Inheritance,Vector,我必须从文件中读取,并根据读取的文件行实例化对象 该文件的格式为: num1 RandomString RandomString num2 num3 num4<br> num1 RandomString RandomString<br> num1 RandomString RandomString num2 num3 num4<br> num1随机字符串随机字符串num2 num3 num4 num1随机字符串随机字符串 num1随机字符串随机字符串num2

我必须从文件中读取,并根据读取的文件行实例化对象

该文件的格式为:

num1 RandomString RandomString num2 num3 num4<br>
num1 RandomString RandomString<br>
num1 RandomString RandomString num2 num3 num4<br>
num1随机字符串随机字符串num2 num3 num4
num1随机字符串随机字符串
num1随机字符串随机字符串num2 num3 num4
num1标识我需要实例化的对象类型。例如,如果num1是1,那么我需要创建一个dog对象,如果它是其他对象,那么我需要创建一个通用的动物对象

下面的代码已经完成一半了

注意:我现在还没有费心把会员保密。现在不是重点

#include <vector>
etc...

class Animal {
    public:
        int num1;
        string 1;
        string 2;
        int num2;
        int num3;
        int num4;
        std::string restOfTheLine;
        Animal(fLine){
            std::stringstream stream(fLine)
            stream >> num1;
            std::getline(stream, restOfTheLine);
       getFunctions etc...
}

class Dog : public Animal{


}


int main(){

    ifstream file("file.txt");
    std::string line;
    std::vector<Animal*> animals;

    while(!file.eof()){
        std::getline(file,line);
        if(line[0]=='1'){
            Dog* dog = new Dog(line);
            animals.push_back(dog);
        } 
        else{
            Animal* animal = new Animal(line);
            animals.push_back(animal);
        }
    std::cout << animals[2]->getNum2();
       

}

#包括
等
类动物{
公众:
int num1;
字符串1;
字符串2;
int num2;
int num3;
int num4;
std::字符串RESTOFLINE;
动物(弗林){
标准::字符串流(弗林)
流>>num1;
std::getline(流,restofline);
获取函数等。。。
}
犬类:公共动物{
}
int main(){
ifstream文件(“file.txt”);
std::字符串行;
性病:媒介动物;
而(!file.eof()){
std::getline(文件,行);
如果(第[0]行=='1'){
狗*狗=新狗(线);
动物。推回(狗);
} 
否则{
动物*动物=新动物(线);
动物。推回(动物);
}
std::cout getNum2();
}
所以我在检查行的第一个字符是否是1。如果是,那么必须实例化一个dog对象

当我编译时,它给了我一个错误-
错误:call dog::dog没有匹配的函数,这显然是因为我没有在派生的dog类中编写任何东西,因为我不确定如何处理它


我有一个指向动物的指针类型的向量,那么如何使用继承添加指向狗的指针呢?

您正试图调用一个不存在的
dog()
构造函数,就像错误消息告诉您的那样。所以只需添加这样一个构造函数即可

为了通过
动物*
指针正确销毁
对象,您还需要
虚拟
析构函数

试试这个:

#包括
#包括
#包括
...
使用名称空间std;
类动物{
公众:
...
动物(常量字符串和燧石){
...
}
虚拟~Animal(){}
...
};
犬类:公共动物{
公众:
狗(const string&fLine):动物(fLine){}
};
int main(){
ifstream文件(“file.txt”);
std::字符串行;
性病:媒介动物;
while(std::getline(文件,行)){
如果(line.empty())继续;
如果(第[0]行=='1'){
动物。推回(新狗(线));
} 
否则{
动物。推回(新动物(线));
}
...
}       
对于(size_t i=0;i

如果您使用C++ 11或更高版本,请考虑使用<代码> STD::UnQuyJPPT< /Cord>来管理对象破坏:

#包括
#包括
#包括
#包括
...
使用名称空间std;
类动物{
公众:
...
动物(常量字符串和燧石){
...
}
虚拟~Animal(){}
...
};
犬类:公共动物{
公众:
狗(const string&fLine):动物(fLine){}
};
int main(){
ifstream文件(“file.txt”);
std::字符串行;
性病:媒介动物;
while(std::getline(文件,行)){
如果(line.empty())继续;
如果(第[0]行=='1'){
//如果使用C++11:
动物。推回(std::独特的(新狗(线));
//如果使用C++14及更高版本:
动物。推回(标准::使_唯一(线));
} 
否则{
//如果使用C++11:
动物。推回(标准::独特的(新动物(线));
//如果使用C++14及更高版本:
动物。推回(标准::使_唯一(线));
}
...
}       
返回0;
}

与您的问题无关,但是
而(!file.eof()){std::getline(file,line);…}
,应该是
而(std::getline(file,line)){…}
如果这里没有向量,您将如何“接近它”?您将以完全相同的方式在这里“接近它”。不清楚您的问题是什么。“接近它”太模糊,无法给出具体、准确的答案。我试图为一个dog对象填充成员变量,但如果这能消除任何误解,我希望该dog对象成为动物向量的一部分?建议:不要从所有成员开始
public
,让访问更容易从所有成员开始
private
使调试更容易。你想做的事情非常清楚。完全不清楚的是你的具体问题是什么?一个很好的类比是:你说你想知道如何修理你的车,然后你澄清你想用你的车去城市的另一边。好吧,但具体来说,什么是错误的你的车?同样,你的C++问题是什么?