2013-03-07 81 views
-2

我問過一個類似的問題,但現在我想更具體。 我所面臨的問題是,我有一個包含非可複製對象,當有人想用我的接口和他沒有利用好(沒有嘗試使用對象的拷貝構造函數),他將得到一個編譯錯誤將一個對象指向對象而不是他的實際代碼。 所以兩個問題:1。 我可以修復它以某種方式把它指向他原來的代碼行? 2.如果我不能,我怎樣才能把一個static_assert,如果有人竟試圖使用複製c'tor只會發生(我已經嘗試了一些,但後來我讓他們即使有人不使用它.. )編制包含非可複製對象的對象警示不可讀

我添加了一個示例代碼和編譯錯誤,以防我不明白... 注意最後編譯錯誤指向ObjectHolder h。文件..而我希望它指向主 謝謝!

*當我替換名稱時出現錯誤..它實際上是創建編譯錯誤的代碼。 和假設我不想實現私有副本c'tor只是轉發殘疾複製

class NonCopyableObject 
{ 
    public: 
     virtual ~NonCopyableObject() {} 

     NonCopyableObject(int i) { m_index = i;} 
     int m_index; 
    private: 
     NonCopyableObject(const NonCopyableObject& other) {} 
}; 

class ObjectHolder 
{ 
    public: 
     virtual ~ObjectHolder(); 
     ObjectHolder(int i) : obj(i) {} 

     NonCopyableObject obj; 
}; 

void main() 
{ 
    ObjectHolder first(1); 
    ObjectHolder second(first); 
} 

1>------ Build started: Project: tester, Configuration: Debug Win32 ------ 
1> main.cpp 
1>d:\users\someone\documents\visual studio 2012\projects\tester\tester\objectholder.h(13): error C2248: 'NonCopyableObject::NonCopyableObject' : cannot access private member declared in class 'NonCopyableObject' 
1>   d:\users\someone\documents\visual studio 2012\projects\tester\tester\noncopyableobject.h(15) : see declaration of 'NonCopyableObject::NonCopyableObject' 
1>   d:\users\someone\documents\visual studio 2012\projects\tester\tester\noncopyableobject.h(8) : see declaration of 'NonCopyableObject' 
1>   This diagnostic occurred in the compiler generated function 'ObjectHolder::ObjectHolder(const ObjectHolder &)' 
+1

嘗試隱藏的ObjectHolder拷貝構造函數太 – 2013-03-07 15:49:07

+4

我敢肯定,這是不是導致在這裏張貼的編譯錯誤的實際代碼。 – Nawaz 2013-03-07 15:49:48

+0

如果你不想讓你的對象可訪問的拷貝構造函數,使它'private'(或者,在C++ 11,'delete'它)。 – 2013-03-07 15:55:21

回答

1

提供不反映提供的代碼中的錯誤消息。

這且不說你有一個錯誤。考慮到代碼:

class ObjectHolder 
{ 
    public: 
     virtual ~ObjectHolder(); 
     ObjectHolder(int i) : obj(i) {} 

     ObjectHolder obj; 
}; 

編譯器是怎麼想以確定所需內存爲ObjectHolder當它是遞歸的金額是多少?

+0

當我複製它時是一個錯誤!!它實際上是 class ObjectHolder { public: virtual〜ObjectHolder(); 的ObjectHolder(int i)以:OBJ(I){} NonCopyableObject OBJ; }; – Alon 2013-03-07 21:35:51