c++ - 特定基类的抽象类的C++向量,作为另一个类成员
问题描述
我有:
- 一个基础抽象类
Shape
。 - 然后,几个子类,其中之一,
Rectangle
. - 一个名为 的模板类
GeneralObject<T>
,具有一个私有成员T
shape(T
具有一个静态断言检查是否是 Shape 的子级),以便GeneralObject
创建 a:GeneralObject<Rectangle>
ObjectManager
我想包含一个(GeneralObject
s) 的向量。
我应该如何实现这个功能才能让这个模板类向量具有任意形状?
我想一种方法是从3)中删除静态断言并创建如下内容:
std::vector<GeneralObject <std::shared_ptr<Shape>>> objects;
但我不确定我是否遵循正确的方法。如果我还可以断言模板函数使用 Shape 的子函数,那就太好了。
解决方案
将成员更改为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
推荐阅读
- android - 在手机屏幕中移动 Pg
- django - Django 模型翻译
- swift - 在 Mapbox iOS SDK 中使用 Bing 地图
- ruby-on-rails - 为什么rails使用redis?
- qt - 通过插件编写将菜单操作添加到 Qt Designer
- data-visualization - 删除 Splunk 图表中的一列名称
- javascript - 为什么过滤方法不能正常工作?
- php - 提取字符串中的半角数字并用php将它们分成3位数字
- azure-machine-learning-studio - 转换从 Cosmos DB 导入的数据的数据列
- django - Django values_list() 小写