2012-03-16 134 views
1

我有一個類層次結構,可以簡單地把這樣接受家長參考:有一個子類的構造函數

struct Parent { 
    Parent() { } 
    Parent(Parent& p, std::string s) { } 

private: 
    // I want this class to be non-copyable 
    Parent(const Parent&); 
}; 

struct Child : public Parent { 
    Child() { } 
    Child(Parent& p) : Parent(p, "hi") { } 
}; 

當我試圖創建兩種情況是這樣的:

Child c1; 
Child c2(c1); 

我從鏘出現以下錯誤:

test.cpp:37:8: error: call to deleted constructor of 'Child' 
     Child c2(c1); 
      ^~~ 
test.cpp:30:8: note: function has been explicitly marked deleted here 
struct Child : public Parent { 
    ^
1 error generated. 

我想這個類是不可複製的,那麼有沒有辦法到h大小寫Parent&重載而不是複製構造函數?我知道爲什麼它的行爲如此,但我正在尋找解決方法。我想要Child(Parent& p)而不必施放它。

我在GCC和Visual Studio中也出現這個錯誤。儘管如此,英特爾的編譯器並沒有得到它,但其他三個廠商的一致行爲似乎表明這是錯誤的,其他的都是正確的。

+0

那麼你是要求解決方法還是爲什麼它不起作用? – ildjarn 2012-03-16 01:35:02

+0

@ildjarn我知道它爲什麼不起作用,我需要一個解決方法。對不起,我會編輯它以使其更清楚。 – 2012-03-16 01:36:45

+0

當傳遞一個符合cv資格的'Child&'時,根本沒有辦法使構造函數具有比複製構造函數更高的過載優先級。你需要去鑄造,輸入擦除,工廠函數而不是公共構造函數或靜態多態性。 – ildjarn 2012-03-16 01:45:46

回答

0

您正在依賴Child的自動生成的副本構造函數,同時使父項的副本構造函數無法訪問。似乎在發生的事情是Child的自動生成拷貝構造函數試圖調用父級的拷貝構造函數,但它不能,因爲它是私有的。

如果你不想在拷貝構造函數中添加,它看起來像你需要明確地投的C1於母公司參考:

Child c2(static_cast<Parent&>(c1)); 

或聲明的拷貝構造函數兒童。

除此之外,我不認爲有一種解決方法。

+0

我知道會解決這個問題,但我不希望這個課程可以複製。 – 2012-03-16 01:34:15

+0

剛剛更新了答案。 – Carl 2012-03-16 01:43:10

+0

您仍然可以將子副本構造函數設爲私有,並且不提供任何定義。 – Collin 2012-03-16 01:48:43

3

你說你不希望你的課是可複製的。

你也說,在你想下面的代碼片段工作你的問題:

Child c1; 
Child c2(c1); 

這些要求是矛盾的。

相關問題