【问题标题】:c++ collection of parent class objectc++父类对象的集合
【发布时间】:2013-01-08 09:49:40
【问题描述】:

我有一个父类 A 和 2 个派生类 A1 和 A2:

class A {

}

class A1 : public class A {}

class A2 : public class A {}

在另一个 B 类中,我想保留一个由对象 A1 或 A2 组成的集合。

class B {
    vector<A1> _A1s;
    vector<A2> _A2s;

}

除了保留 2 个单独的向量 A1s 和 A2s,有没有办法将这 2 个向量组合起来?我考虑过矢量或矢量,但是当 A1 或 A2 调整大小时,任何一种方式都可能丢失对象(我假设)。

有什么想法吗?

【问题讨论】:

  • 您可能需要重新考虑在容器中存储指向 A 的指针的优缺点,而不是维护两个单独的向量
  • 我认为您应该更多地了解C++中的继承;这个话题对你来说似乎很新,很可能你一开始甚至不想要任何继承(初学者倾向于在 C++ 中过度使用继承)。

标签: c++ inheritance collections vector


【解决方案1】:

您可以使用指向基类型的智能指针向量

std::vector<std::shared_ptr<A>> a_ptr;

注意: 您需要将虚拟析构函数添加到 A

class A {
public:
  virtual ~A() {}
};

用法:

struct B {
public:
  B() {
    a_ptr.push_back(std::shared_ptr<A>(new A1));
    a_ptr.push_back(std::shared_ptr<A>(new A2));
  }

private:
  std::vector<std::shared_ptr<A>> a_ptr;
};

int main(int argc, char* argv[])
{
  B b;
  return 0;
}

你在类定义之后错过了;,并且你在下面的语句中的 A 前面有额外的关键字 class:

class A1 : public class A {};

应该是:

class A1 : public A {};

【讨论】:

  • 好答案。但是让我补充一点:将 A1 / A2 和其他实例添加到向量后,您将不知道哪些元素指向基类或哪个派生类。有一个简单的方法可以找到:向基类及其派生类添加一个虚拟方法,如“std::string getType()”。每个类都返回其标识符字符串。因此,在解释向量时,您可以使用此方法来识别 A 指针背后的内容,并执行例如 static_cast 来获取整个实例。
  • 正确。随着引用计数的增加,对象不会被删除。我认为 shared_ptr 是我所追求的。谢谢
  • 顺便说一句,我尝试在向量中搜索>。有没有简单的方法可以做到这一点?我知道我可以为向量 实现运算符==。这家伙呢?
  • 您需要迭代器才能访问 stl 容器,请参见示例:cplusplus.com/reference/vector/vector/begin
【解决方案2】:

你可以使用指针向量

class B {
public:
    std::vector<A*>   _AXs;
};

它将接受 A1 和 A2 指针类型。

请注意,在这种情况下,您应该将A 类的析构函数设置为虚拟。 否则,当您尝试删除 A* 对象时,程序无法猜测真正的类型是什么。

class A {
public:
    virtual ~A() {}    
};

【讨论】:

    【解决方案3】:

    您可以使用其他人所说的,加上一个称为visitor 的设计模式,如果您希望仍然能够将底层A 指针用作A1A2。访问者模式并不是真正为此而设计的,但以这种方式使用它很好。

    【讨论】:

      猜你喜欢
      • 2017-10-24
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 2018-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多