假設我有一個不可複製類Foo
, 及其構造的一個恰好收到一個參考Foo
。構造富::富接收到foo的引用而不是拷貝構造
class Foo
{
public:
Foo(Foo& parent) {...}
private:
void operator=(Foo); // disabled
...
};
編譯器認爲這是一個拷貝構造函數, 而它完全無關的東西複製(所以賦值運算符是禁用的)。
這樣定義構造函數有沒有什麼危險, 或者我應該人工改變它的簽名,例如:使用指針而不是參考, 或添加一個強制的虛擬參數?
這裏是一些上下文(可能不需要理解/回答我的問題)。
我有一個我自己寫的類庫, 作爲用戶代碼和另一個庫之間的連接。 爲了簡潔起見,另一個庫提供了一項服務,我稱其爲frobnicate。 用戶代碼可以是這樣的:
class UsefulObject: public mylib::Frobnicator
{
...
void DoStuff()
{
int x = ...
...
frobnicate(x); // it's important to allow simple syntax here
frobnicate(x + 1);
...
}
...
};
我想支持用戶對象的層次結構:每個對象都包含在另一個(其父), 同時有幾個(在我的情況,5)頂包含所有其他對象的級別對象。
每個對象都有一個日誌文件;我希望每個調用都被記錄在多個日誌文件中,直到最高級對象爲止。
我有這種方式來實現:
namespace mylib
{
class Frobnicator // provides the frobnication service
{
public:
Frobnicator(Frobnicator& parent): parent(parent) {}
protected:
virtual void frobnicate(int x) {
... // some logging code
parent->frobnicate(x);
}
private:
Frobnicator& parent;
};
namespace internal // users of mylib, please don't use this!
{
class TheUltimateFrobnicator: public Frobnicator
{
protected:
virtual void frobnicate(int x) {
the_other_library::frobnicate(x);
}
private:
TheUltimateFrobnicator(int id); // called by a factory or some such
};
}
}
「編譯器認爲這是一個複製構造函數」。那麼,根據定義,即使您不希望它進行復制,它也是一個複製構造函數。 – 2011-01-23 15:11:29