2017-08-03 78 views
-1

我有一個從數據容器類派生的類。構造函數不能初始化容器的所有內容,所以有必要調用另一個類成員函數(提供一些額外的數據)來完成初始化。該成員函數將布爾值設置爲true,表明數據已準備好進行訪問。有條件地從C++中的繼承類訪問基類

如果數據是班上的一員,我將它設置私人/保護,我想有一個訪問,如:

mycontainer& get_data() { check_macro(ready, "Data not ready"); return data; } 

我怎麼這樣如果類是繼承自mycontainer?我可以從mycontainer私下推導它,然後期望返回參考this將公開嗎?

+0

你可以重構的構造,因此不會退出,直到對象被完全初始化? – NathanOliver

+0

首先你的非構造函數初始化有些腥意,其次你的最後一句話是非常荒謬的。如果你需要任何幫助,你將不得不提供比你更好的解釋。 – snb

+0

@NathanOliver:這在我現在的情況下是可行的,我同意這是更好的風格。然而,我認爲有些情況下,當它被聲明時完全初始化對象是不合邏輯的,例如,存儲的部分數據可能由聲明時未知的非const成員計算。 – Joce

回答

1

請記住,當您從另一個類繼承時,您的新類具有基類所有的成員。您只需以班級成員的身份直接訪問它們即可。

在下面的例子中,派生類沒有成員,但由於它來自「DataContainerClass」繼承,它具有所有類的成員,從而它具有「整數」構件。

因此,無論您的數據容器基類有哪些成員,您只需訪問它們,就好像它們是在您的類中定義的那樣。當然,成員必須是可訪問的。 (公共基類,例如)

class DataContainerClass 
{ 
    public std::vector<int> Ints; 
} 



class MyClass : public DataContainerClass 
{ 
} 

int main() 
{ 
    MyClass cls; 

    // Ints is visible as a member of 'MyClass', because 
    // MyClass inherits from DataContainerClass. 
    cls.Ints.push_back(1); 
    cls.Ints.push_back(2); 

} 
+0

謝謝。在你的例子中,如果我將'MyClass'更改爲'class MyClass:private DataContainerClass',那麼我需要添加一個訪問器來返回'Ints',以便在'main'中使用它。我的問題是,如果我有'class MyClass:private std :: vector ',我可以定義一個基類'vector '的訪問器嗎? – Joce

+0

在這種情況下,您不需要訪問器。使用將是 – ttemple

+0

如果您公開繼承,則不需要訪問者。有了私人繼承,你會的。看到這個很好的討論你想要做什麼:https://stackoverflow.com/questions/4353203/thou-shalt-not-inherit-from-stdvector – ttemple