特定基础 class 的抽象 class 的 C++ 向量,作为另一个 class 成员

C++ Vector of abstract class of specific base class, as another class member

我有:

  1. 基础摘要 class Shape.
  2. 然后,几个childclass,其中一个,Rectangle.
  3. 一个名为 GeneralObject<T> 的模板 class,具有私有成员 T 形状(T 有静态断言检查是否为 child 形状) , 为了创建 GeneralObject: GeneralObject<Rectangle>
  4. 一个ObjectManager,我想包含一个GeneralObject(s)的向量。

我应该如何实现此功能才能使此模板向量 classes 具有任意形状?

我想一种方法是从 3) 中删除静态断言并创建如下内容:

std::vector<GeneralObject <std::shared_ptr<Shape>>> objects;

但我不确定我是否遵循了正确的方法。 如果我还可以断言模板函数使用 child 的 Shape.

就好了

具有不同模板参数的两个模板变体被视为不同的 classes。这是因为预处理器为每个变体复制了一次整个模板代码,但替换了模板参数。

如果你想要一个包含相同基本模板的不同对象的容器class你可以使用简单的多态性。

为您的 template GeneralObject class 创建一个非模板基 class 并创建一个包含指向该基 class.

的指针的容器
class GeneralObjectBase;
template<typename T> class GeneralObject : public GeneralObjectBase;

std::vector<GeneralObjectBase*> objects;

GeneralObject 的成员更改为指向 T 而不是 T 的指针:

template<typename T>
class GeneralObject {
public:
  GeneraObject(std::shared_ptr<T> object) : object(object) {}

private:
  std::shared_ptr<T> object;
};

您可以将其用作

auto gObj = GeneralObject<Shape>(std::make_shared<Rectangle>());

你的容器将是

std::vector<GeneralObject<Shape>> objects;
objects.emplace_back(std::make_shared<Rectangle>());
objects.emplace_back(std::make_shared<Circle>());

总结起来是这样的:

#include <iostream>
#include <memory>
#include <vector>

struct Shape {
  virtual void draw() const = 0;
};

struct Rectangle : Shape {
  void draw() const override { std::cout << "Rectangular drawing\n"; };
};

struct Circle : Shape {
  void draw() const override { std::cout << "Circular drawing\n"; };
};

template <typename T>
class GeneralObject {
 public:
  GeneralObject(std::shared_ptr<T> object) : object(object) {}

  void draw() const { object->draw(); }

 private:
  std::shared_ptr<T> object;
};

int main() {
  std::vector<GeneralObject<Shape>> objects;
  objects.emplace_back(std::make_shared<Rectangle>());
  objects.emplace_back(std::make_shared<Circle>());

  for (const auto& obj : objects) obj.draw();
}

这将输出

Rectangular drawing
Circular drawing