1

这是一个相当复杂的问题。所以我有一个绝对抽象的基类和 3 个派生类(A、B、C)。

使用std::ifstream& operator>>(std::ifstream& ifs, Base* a) 我有一个设置如下的文件:

一个 5 2

乙 2 3

每行都以 A、B、C 开头,告诉我我得到的类的类型,然后是类的实际值。

int a, b;
std::string what;
ifs >> what >> a >> b;
if (what == "A")
{
  //create an A class using a, and b.
}

因此,从 Base 运算符>>我必须调用派生类函数之一,其中最终“a”(Base *)将获得从函数返回的 A、B 或 C 类,并且我正在保存“a”在异构集合中。

这可能吗?我该怎么做,感觉就像我只是在做一个圆圈,我需要 Base 类中的 Derived 类和 Derived 类中的 Base 类。

4

3 回答 3

1

制作一个工厂函数可能更有意义,它可以是 Base() 的静态成员;

如果你想保持当前的结构,我认为你可以这样解决:

std::ifstream& operator>>(std::ifstream& ifs, Base* a){
    // remove whatever object you currently have in a
    if(a!=NULL) delete a;

    // standard factory
    // e.g. read what you need to determine the correct derived class 
    // and call its constructor
    int a, b;
    std::string what;
    ifs >> what >> a >> b;
    if (what == "A")
    {
        //create an A class using a, and b.
        a = new A(a,b);
    }
    ...
}

编辑:您可能需要在原型中使用对 Base 指针的引用:

std::ifstream& operator>>(std::ifstream& ifs, Base *&a){ ... }
于 2013-05-05T16:18:46.620 回答
0

真的需要派生类吗?根据您提供的信息和代码,除了类型之外,我看不出“A”、“B”和“C”之间有什么区别,所以我想出了以下代码:

#include <string>
#include <iostream>
using namespace std;

class foo {
public:
    foo(int aa = 0, int bb = 0, int tt = 0)
      : a(aa), b(bb), tp(tt) {}

    // void set_type(int t) { tp = t; }
protected:
    int a, b, tp
};

int main() {
    char t;
    int a, b;
    while (cin >> t >> a >> b) {
       foo f(a, b, t-'a');
    }
} 
于 2013-05-05T16:15:53.440 回答
0

我设法使用此链接的帮助解决了我的问题:感谢 Scott Jones

基本上,我创建了一个特殊函数,其全部目的是找出它需要创建哪个类(A、B、C)并将其发送回处理。

Base* Deserialize(std::ifstream &ifs)
{
 Base *temp;
 std::string what;
 ifs >> what;
 if (what== "A")
   {
      temp = new A();
      return temp;
   }
}

之所以有效,是因为这是一个在基类和派生类之外的特殊函数,它可以看到和使用它们。

于 2013-05-06T17:03:22.113 回答