2015-11-05 109 views
0

這僅僅是一個代碼片段解釋類層次結構,而不是實際問題的代碼基地的拷貝構造函數的類不應該叫

class A 
{}; 

class B : public class C 
{}; 

class C : public NocopyClass // constructors are private in Nocopy class 
{}; 

template<typename T1, typename T2> 
class D 
public: 
    T1 _t1; 
    T2 _t2; 
    D(T1& t1, T2& t2) : _t1(t1),_t2(t2) {} 

{ 
}; 

class E: public class D<A,B> 
{ 
    E(const& a,const& b) : D<A,B>(a,b) {} 
}; 

調用函數:

A objA; 
B objB; 

E objE(objA,objB); 

從調用程序我想要將A的對象和B的對象傳遞給E類 這裏在E中定義的複製構造函數被調用,並且A和B的對象被複制,然後調用B類的複製構造函數,直到超級基類NocopyClass拷貝構造函數, 哪一個不允許複製對象。

我該如何修改調用函數,以便不調用基類構造函數? 有什麼辦法嗎?

+0

繞過基類複製構造函數是不可能的,也是不需要的。未初始化的基類會有什麼用處?這些類可能有很好的理由是不可複製的...... – Unimportant

+0

你能提供*真實*代碼嗎? 'E(const&a,const&b)'不是一件事情。這裏沒有任何地方叫做E的拷貝構造函數。 – Barry

回答

1

嘗試聲明_t1和_t2作爲參考。

template<typename T1, typename T2> 
{ 
class D 
public: 
    T1 &_t1; 
    T2 &_t2; 
    D(T1& t1, T2& t2) : _t1(t1),_t2(t2) {} 


}; 
+0

非常感謝。其工作原理 – user3836455

+0

替代實施。將T1 _t1和_t2更改爲指針。您可以在不調用複製構造函數的情況下複製指針。 –

0

你可以移動B的實例,而不是複製它,但你不會是能夠做到這一點正是你想要的方式 - 你不可錯過的B一個已經存在的情況下,你需要發送一個新來E(見main波紋管的代碼):

#include <utility> 

template<typename T1, typename T2> 
class D 
public: 
    T1 _t1; 
    T2 _t2; 
    D(T1 &t1, T2 &&t2) : _t1 (t1) { 
     _t2 = std::move (t2) ; 
    } 
}; 

class E: public class D<A,B> 
{ 
    E(const& a, &&b) : D<A,B>(a, std::move(b)) {} 
}; 

和創造的E一個新的實例時,你需要做的是這樣:

A a; // no problem with a 
E (a, B()) ; // You need to have a rvalue for b 

請參閱std::move文檔 - 關於移動和右值引用的SO有很多主題。