【问题标题】:Pointers to derived class objects stored in a vector of pointers to base class objects [closed]指向派生类对象的指针存储在指向基类对象的指针向量中[关闭]
【发布时间】:2021-05-20 21:53:29
【问题描述】:

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

文件格式为:

num1 RandomString RandomString num2 num3 num4<br>
num1 RandomString RandomString<br>
num1 RandomString RandomString num2 num3 num4<br>

num1 标识我需要实例化的对象类型。例如,如果 num1 是 1,那么我需要创建一个 dog 对象,如果是其他对象,那么我需要创建一个通用的 animal 对象。

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

注意:目前我还没有考虑将成员设为私有。目前不是优先事项。

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

}

所以我正在检查该行的第一个字符是否为 1。如果是,则必须实例化一个 dog 对象。

当我编译它给我一个错误 - error:no matching function for call dog::dog,这显然是因为我没有在派生的狗类中写任何东西,因为我不确定如何处理它。

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

【问题讨论】:

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

标签: c++ inheritance vector


【解决方案1】:

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

您还需要Animal 中的virtual 析构函数,以便通过Animal* 指针正确销毁Dog 对象。

试试这个:

#include <fstream>
#include <vector>
#include <string>
...
using namespace std;

class Animal {
    public:
        ...
        Animal(const string &fLine) {
            ...
        }

        virtual ~Animal() {}

        ...
};

class Dog : public Animal{
    public:
        Dog(const string &fLine) : Animal(fLine) {}
};

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

    while (std::getline(file, line)) {
        if (line.empty()) continue;
        if (line[0] == '1') {
            animals.push_back(new Dog(line));
        } 
        else {
            animals.push_back(new Animal(line));
        }
        ...
    }       

    for(size_t i = 0; i < animals.size(); ++i) {
        delete animals[i];
    }

    return 0;
}

如果您使用 C++11 或更高版本,请考虑使用 std::unique_ptr 为您管理对象销毁:

#include <fstream>
#include <vector>
#include <string>
#include <memory>
...
using namespace std;

class Animal {
    public:
        ...
        Animal(const string &fLine) {
            ...
        }

        virtual ~Animal() {}

        ...
};

class Dog : public Animal{
    public:
        Dog(const string &fLine) : Animal(fLine) {}
};

int main() {
    ifstream file("file.txt");
    std::string line;
    std::vector<std::unique_ptr<Animal>> animals;

    while (std::getline(file, line)) {
        if (line.empty()) continue;
        if (line[0] == '1') {
            // if using C++11:
            animals.push_back(std::unique_ptr<Animal>(new Dog(line)));
            // if using C++14 and later:
            animals.push_back(std::make_unique<Dog>(line));
        } 
        else {
            // if using C++11:
            animals.push_back(std::unique_ptr<Animal>(new Animal(line)));
            // if using C++14 and later:
            animals.push_back(std::make_unique<Animal>(line));
        }
        ...
    }       

    return 0;
}

【讨论】:

    猜你喜欢
    • 2014-06-16
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 2011-11-04
    • 2021-07-02
    相关资源
    最近更新 更多