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++问题是什么?