2011-01-23 52 views
3

假設我有一個不可複製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 
     }; 
    } 
} 
+0

「編譯器認爲這是一個複製構造函數」。那麼,根據定義,即使您不希望它進行復制,它也是一個複製構造函數。 – 2011-01-23 15:11:29

回答

7

這似乎是在這樣一個構造函數的含義一個不幸的歧義。我認爲這歧義最直接的方法是使用一個指針

class Frobnicator // provides the frobnication service 
{ 
public: 
    explicit Frobnicator(Frobnicator *parent): parent(parent) {} 
protected: 
    virtual void frobnicate(int x) { 
     ... // some logging code 
     parent->frobnicate(x); 
    } 
private: 
    void operator=(Foo); // disabled 
    Frobnicator(Frobnicator const&); // disabled 

    Frobnicator *parent; 
}; 

我知道有很多誰也期待參數是一個指針反正人。順便提一句,你自己打錯parent.frobnicate作爲parent->frobnicate

+1

這裏不會聲明構造函數`explicit`的幫助嗎? – 2011-01-23 14:24:51