2
我在C++中有一箇舊的工廠實現,我想使用唯一指針而不是原始指針。我的代碼的一個最小例子如下。我有一個基類A
,以及派生類B
。在main()
中,我將1
轉換爲create
方法A
,並且b1
的類型現在更改爲B
。在C++中使用unique_ptr的工廠模式
#include <iostream>
#include <map>
class A {
public:
A() {}
virtual void Foo() {}
std::map<int, A *> ®isterType() {
static std::map<int, A *> map_instance;
return map_instance;
}
A *create(int n) { return registerType()[n]; }
};
class B : A {
public:
B() { registerType()[1] = this; }
void Foo() { std::cout << "I am B!\n"; }
};
static B b0;
int main() {
A *b1 = new A();
b1 = b1->create(1);
b1->Foo();
return 0;
}
現在,如果我想改變原始指針,以獨特的指針,我自然會得到錯誤的集合(下面的代碼導致錯誤):
#include <iostream>
#include <map>
#include <memory>
class A {
public:
A() {}
virtual void Foo() {}
std::map<int, std::unique_ptr<A>> ®isterType() {
static std::map<int, std::unique_ptr<A>> map_instance;
return map_instance;
}
std::unique_ptr<A> create(int n) { return registerType()[n]; }
};
class B : A {
public:
B() { registerType()[1](this); }
void Foo() { std::cout << "I am B too!\n"; }
};
static B b0;
int main() {
std::unique_ptr<A> b1(new A());
b1 = b1->create(1);
b1->Foo();
return 0;
}
的錯誤是:
In member function 'std::unique_ptr<A> A::create(int)':
use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = A; _Dp = std::default_delete<A>]'
std::unique_ptr<A> create(int n) { return registerType()[n]; }
In constructor 'B::B()':
no match for call to '(std::map<int, std::unique_ptr<A> >::mapped_type {aka std::unique_ptr<A>}) (B* const)'
B() { registerType()[1](this); }
^
所以我想知道:
- 被打算在像我這樣的情況下使用獨特的指針? (我假設回答應該是!)
- 我需要將
this
作爲unique_ptr
類型傳遞給registerType
方法。如何將指針的所有權傳遞給當前實例(this
關鍵字)以unique_ptr
? (如果有可能或有意成爲可能) - 如果在這裏使用唯一指針是一種很好的做法,我應該如何實現它?
_「我自然會收到錯誤集合_」 - 請在您的文章中包含錯誤的全文。隨意忽略多行發生的重複。 – 2014-12-03 22:01:39
我不明白這將如何與'std :: unique_ptr'一起使用。你當然可以將它們存儲在'std :: map'中,並且可以*引用它們。但他們最好被做成*移動*;未複製。將它們從您的地圖中移出將起作用,但是爲什麼還要在第一時間製作地圖。看起來'std :: shared_ptr'會爲你所嘗試的付出更多的紅利(如果配置正確,你也可以設置共享'this') – WhozCraig 2014-12-03 22:10:52
@ a.sam它的寫法非常混亂,你有一個「創建」功能,它不會創建任何內容,並通過執行'b1 = b1-> create(1);' – PeterT 2014-12-03 23:27:46