2013-09-24 139 views
2

我試圖創建一個成員(類A的道具)到類(B)。類A的成員「prop」需要獲取在其構造函數中傳遞的新創建的B實例的「this」指針。正如下面的代碼段(代碼段1)所示。類成員在實例初始化時需要這個指針

但是,這在編譯時失敗,並顯示錯誤消息: 「A typespecifier was expected」(德語翻譯)。

我認爲這是關於我不能在這種情況下使用這個指針,但我不想去Snippet 2的方式,並使用一個指針。這對我來說並不實際。

有什麼辦法可以完成這個接近第一個代碼片段的編碼風格嗎?

片段1

class B; 

class A 
{ 
public: 
    A(B* b) 
    { 
     // ... 
    }; 

}; 

class B 
{ 
public: 
    A prop(this); 
}; 

片段2

class B; 

class A 
{ 
public: 
    A(B* b) 
    { 
     // ... 
    }; 

}; 

class B 
{ 
public: 
    B() 
    { 
     this->prop = new A(this); 
    } 

    A* prop; 
}; 

編輯:只是想出了這個片段,但在一個類別,它具有很多的時候使得它真正不可讀。

片段3

class B; 

class A 
{ 
public: 
    A(B* b) 
    { 
     // ... 
    }; 

}; 

class B 
{ 
public: 
    B() : prop(this) {}; 

    A prop; 
}; 

非常感謝!
Sebastian

回答

2

我自己得到了解決現在。

對於非實驗;非C++ 11標準,luri Covalisin是對的。

但是,如果我們給看一下C++ 11,我們可以做如下:

class B; 

class A 
{ 
public: 
    A(B* b) 
    { 
     // ... 
    }; 

}; 

class B 
{ 
public: 
    A prop{this}; 
}; 

這看起來有點怪異,但更像是我一直在尋找。

5

您不能在類聲明中初始化類成員。正如您在代碼片段#3中正確指出的那樣 - 構造函數初始化列表存在於成員中,需要將參數傳遞給構造函數。

使用的initializtion列表是這樣做的最佳方式恕我直言,筆記,成員在聲明的順序初始化,而不是在初始化列表的順序:

class B 
{ 
    public: 
     B() : prop(this) {}; 

    A prop; 
}; 
+0

我發現了一個包含C++ 11代碼的解決方案,但對於非C++ 11代碼,您是絕對正確的!謝謝。 –