2012-05-10 65 views
2

我有一個叫做QuadTree的類。我最近創建了它的複製構造函數即:課堂複製操作,它是如何工作的?

QuadTree(const QuadTree &cpy); 

說例如我還沒有填寫此構造函數。只要它不被使用,代碼就會編譯得很好。現在,我有一個函數調用subtractTrees:

QuadTree * subtractTrees(QuadTree LHS, QuadTree RHS); 

此之前製作拷貝構造函數的代碼工作得很好。現在,使用此功能,我收到以下錯誤編譯程序時:

Undefined Referance to QuadTree::QuadTree(QuadTree const&) 

如,因爲我的拷貝構造函數在代碼中使用,還沒有填寫時會出現錯誤。這是否意味着現在我有一個拷貝構造函數調用這樣的被動函數(subtractTrees)會調用拷貝構造函數?

如果是這樣,有辦法阻止這種情況發生,同時仍然使用複製構造函數?我需要這樣做的原因是複製用於這樣的功能將大大減慢我的代碼。但我需要複製構造函數來輕鬆複製樹。

編輯:我只是通過填寫拷貝構造函數固定的錯誤,但問題更多的是

  1. 它怎麼沒有擺在首位的拷貝構造函數工作。
  2. 如果有人試圖通過在每次使用樹時不復制樹來節省速度,是否有一種方法可以利用這種不需要複製構造函數?

回答

4

您必須對您的QuadTree類中定義的構造函數,當你這樣做的編譯器不產生隱式的拷貝構造函數,它假定,如果你需要它,你將提供你自己的。

當您添加函數,該函數採用值類型QuadTree需要一個複製構造函數來執行這些副本,因此編譯器抱怨。

QuadTree * subtractTrees(QuadTree LHS, QuadTree RHS); 
         ^^^^^^^^^^^^ ^^^^^^^^^^^^^ 

按值傳遞需要複製構造函數。

如果是這樣,有辦法阻止這種情況發生,同時仍然使用複製構造函數?

我不確定我是否理解這個問題。如果你想創建你的類對象的副本,你需要一個拷貝構造函數。如果你想避免副本通過const引用傳遞你的對象。

QuadTree * subtractTrees(const QuadTree &LHS, const QuadTree &RHS); 
+0

那麼就是它,如果我必須填寫內容,並與潛在的緩慢承擔後果,怎麼着沒有複製構造函數之前的代碼工作? –

+0

你能通過參考嗎? – joshp

+0

@Ben:通過假設*填充*意味着提供一個定義,您的代碼之前工作,因爲在提供新功能之前,您的代碼不需要複製構造函數在任何地方被調用。 –

1

當你還沒有聲明覆制構造函數時,編譯器爲你隱式提供了一個,這就是爲什麼你的代碼在以前工作。由於您將QuadTree的值傳遞給subtractTrees,因此在聲明自己的拷貝構造函數之前調用了此隱式拷貝構造函數。一旦你聲明瞭(但沒有定義)你自己的拷貝構造函數,編譯器就會停止隱式定義一個拷貝構造函數,因此所有以前對拷貝構造函數的調用(例如在subtractTrees函數中)都會產生未定義的引用。

如果你想避免在subtractTrees功能的副本,你可以通過引用傳遞PARAMATERS:

QuadTree * subtractTrees(const QuadTree &LHS, const QuadTree &RHS);