特定基础 class 的抽象 class 的 C++ 向量,作为另一个 class 成员
C++ Vector of abstract class of specific base class, as another class member
我有:
- 基础摘要 class
Shape
.
- 然后,几个childclass,其中一个,
Rectangle
.
- 一个名为
GeneralObject<T>
的模板 class,具有私有成员 T
形状(T
有静态断言检查是否为 child 形状) , 为了创建 GeneralObject
: GeneralObject<Rectangle>
- 一个
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
我有:
- 基础摘要 class
Shape
. - 然后,几个childclass,其中一个,
Rectangle
. - 一个名为
GeneralObject<T>
的模板 class,具有私有成员T
形状(T
有静态断言检查是否为 child 形状) , 为了创建GeneralObject
:GeneralObject<Rectangle>
- 一个
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