首页 > 解决方案 > 特定基类的抽象类的C++向量,作为另一个类成员

问题描述

我有:

  1. 一个基础抽象类Shape
  2. 然后,几个子类,其中之一,Rectangle.
  3. 一个名为 的模板类GeneralObject<T>,具有一个私有成员Tshape(T具有一个静态断言检查是否是 Shape 的子级),以便GeneralObject创建 a:GeneralObject<Rectangle>
  4. ObjectManager我想包含一个( GeneralObjects) 的向量。

我应该如何实现这个功能才能让这个模板类向量具有任意形状?

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

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

但我不确定我是否遵循正确的方法。如果我还可以断言模板函数使用 Shape 的子函数,那就太好了。

标签: c++c++11templatesshared-ptr

解决方案


将成员更改为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

推荐阅读