【发布时间】:2015-03-19 11:17:03
【问题描述】:
我有一个模板化包装器,其中包含一个类的实例,该类继承了一个纯虚拟类。
我的问题是如何将数据存储在包装器中。
- 我无法使用副本,因为无法实例化纯虚拟类(如果我使用简单的虚拟类,则无法进行切片)。
- 我没有设法保留参考。这个 ref 变得无效,因为我不管理我得到的对象的分配(超出范围)。
- 我唯一的解决方案是使用指针,即使我想避免这种情况,因为这不是很安全,我需要我的代码是健壮的。
我能做什么?
这是一个模拟我的问题的小例子:
#include <iostream>
#include <string>
#include <ctime>
#include <cmath>
using namespace std;
class Module
{
public:
Module() : m(rand())
{
cout << "m = " << m << endl;
}
virtual void f() = 0;
int m;
};
class ModuleA : public Module
{
public:
ModuleA() : ma(rand())
{
cout << "ma = " << ma << endl;
}
void f() {}
int ma;
};
template<typename T>
class Container
{
public:
Container(T e) : element(e) {}
T element;
};
// Objects are created outside of main
ModuleA createModule()
{
return ModuleA();
}
Container<Module&> createContainer()
{
return Container<Module&>(createModule());
}
int main()
{
srand((unsigned int)time(NULL));
Container<Module&> conta = createContainer();
ModuleA& ca1 = dynamic_cast<ModuleA&>(conta.element); // wrong !
system("pause");
return 0;
}
【问题讨论】:
-
@AntoineLafarge 我在您的代码中没有看到任何
Module&。我看到的唯一参考是T& Container<T>::element,我看到的唯一实例是Container<ModuleA>。只需将T& element替换为T element即可。 -
在我看来这是一个所有权问题;我过去在 C++ 中也遇到过一些问题。将 unique_ptr 用于内部所有权,仅将原始指针从它分发到您拥有的其他事物(封装实体)。将 shared_ptr 用于返回给调用者的东西,但返回给他们一个weak_ptr,合同是“如果我返回一个weak_ptr,在任何情况下你都不会用它构造一个shared_ptr并存储它——我负责这个对象”。这些是我多年来学到的一些东西。
-
提高警告级别:
warning C4239: nonstandard extension used : 'argument' : conversion from 'ModuleA' to 'ModuleA &' -
@GiulioFranco 我的错,我刚刚更新了代码以显示我想要做什么。
-
@AntoineLafarge 我强烈建议你也看看
std::weak_ptr。
标签: c++ reference wrapper pure-virtual template-classes