我有一個模板包裝器,其中包含繼承純虛擬類的類的實例。
我的問題是如何將數據存儲在包裝中。
- 我無法使用副本,因爲純虛擬類不能實例化(或者如果我使用簡單的虛擬類,則會切片)。
- 我沒有設法保留參考。這個參數變得無效,因爲我不管理我得到的對象的分配(超出範圍)。
- 我唯一的解決方案是使用指針,即使我想避免這種情況,因爲這不是很安全,我需要我的代碼才能健壯。
我該怎麼辦?C++存儲對作爲類成員的純虛擬類的引用
下面是模擬我的問題一個小例子:
#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;
}
這不應該編譯。您將非常量引用綁定到臨時對象。 – 2015-03-19 11:24:17
此代碼在Visual Studio 2013中編譯時沒有任何警告。 – 2015-03-19 11:24:56
@AntoineLafarge然後你使用的是非標準的擴展(它們可能在編譯器中默認啓用)。你應該在問題中說明編譯器。 – user2079303 2015-03-19 11:29:08