2016-09-15 64 views
0

我有一個C++中的基類,它有一些受保護的成員變量(儘管我認爲它在這種情況下是受保護的而不是私有的)。子類數據的超類設置對象

我有一個從這個基類派生的派生類。其中有一個公共函數,它創建基類的一個對象並返回該對象。然而,在這個函數中,我需要能夠將受保護的成員變量設置爲特殊狀態。

實施例:

class Base 
{ 
protected: 
    int b_value; 
}; 

class Derived : public Base 
{ 
public: 
    Base createBase() 
    { 
    Base b; 
    b.b_value = 10; 
    return b; 
    } 
}; 

我特別只想派生類可以被保護的成員變量。我不想在基類中使用公共的訪問器方法。

我最初試圖通過使派生類的createBase()函數成爲Base類的朋友來解決這個問題。像這樣:

class Base 
{ 
protected: 
    int b_value; 
    friend Base Derived::createBase(); 
}; 

class Derived : public Base 
{ 
public: 
    Base createBase() 
    { 
    Base b; 
    b.b_value = 10; 
    return b; 
    } 
}; 

正如您所見,由於Derived尚未定義,因此無法編譯。如果重要,這兩個類在單獨的頭文件中定義。我想一個方法來描述這個問題是一個「雞和蛋」問題,其中一個需要另一個。

我有一種感覺,這必須是「我沒有正確地設計我的類,需要重新思考我是如何做到這一點」,但我無法弄清楚如何讓這個工作。

回答

2

您可以轉發聲明Derived,然後使其在Base的朋友:

class Derived; 
class Base 
{ 
    friend class Derived; 
protected: 
    int b_value; 
}; 

class Derived : public Base 
{ 
public: 
    Base createBase() 
    { 
    Base b; 
    b.b_value = 10; 
    return b; 
    } 
}; 

但是這個設計似乎有嚴重缺陷,以我爲你已經說過,你應該做createBase()靜態公共方法在Base類併爲b_value設置一個setter或一個設置它的構造函數。

請記住,現在裏面createBase()this->b_value也可用。

+0

前向聲明在這裏工作嗎?這兩個類在單獨的頭文件中定義。你需要在Base.hpp中包含「#include」Derived.hpp「'',它不會編譯。 –

+0

@TLytle沒有關於前向聲明的事情,你不包括派生在基地.hpp中,而是使用前進,這將工作得很好。 –