2014-04-01 44 views
-8

我們假設我們都給予瞭如下功能:我們假設,我們都給予了以下功能

class MyClass 
{ 
    MyClass(double var) { 
     this->var = var; 
    } 
protected: 
    double var; 
}; 

MyClass foo(MyClass1 obj) { 
} 

在功能foo()我們希望得到obj.var訪問。但是如何? 所以我們不能創造吸氣getVar() 更多了我們不能用關鍵字double再次,我們不能讓我們的功能foo()MyClass 另外的朋友,foo()不能的方法。

+3

爲什麼你要排除可能的解決方案?關鍵字'double'可以隨意使用多次。用它。 C++支持朋友功能。使用它們。 –

+0

好的。首先回答@juanchopanza的問題,然後告訴我們,你爲什麼要添加對語言不存在的限制? – ElmoVanKielmo

回答

0

您無法從類之外或任何派生對象訪問類的受保護成員。 如果您不能直接更改MyClass,但想要訪問protected值,則可以使用定義getter的另一種類型從其繼承。

class MyClass 
{ 
public: 
    MyClass(double var) : member_var(var) {} 
protected: 
    double member_var; 
}; 
class OtherClass : public MyClass 
{ 
public: 
    OtherClass(double var) : MyClass(var) {} 
    double get_member(void) const { return member_var; } 
}; 

您可以使用派生類foo

OtherClass foo(OtherClass obj) 
{ 
    double x = 5.0 + obj.get_member(); 
} 
1

Makr MyClass1通過一個成員函數一個子類的MyClass和提供公共訪問MyClass::var

MyClass1 : public MyClass 
{ 
public: 
    auto v()->decltype((var)) // returns a reference to var 
    { 
    return var; 
    } 
}; 

然後

MyClass foo(MyClass1 obj) { 
    obj.v()++; // increments var 
    return obj; 
} 

注意,這需要MyClass::MyClass(double)構造是非私有的。

另一種替代方法是在派生類中公開var。但是,如果你發現自己在真實的代碼中這樣做,你必須停下來並問自己幾個問題:

MyClass1 : public MyClass 
{ 
public: 
    using MyClass::var; // look! var is now public 
}; 

MyClass foo(MyClass1 obj) { 
    obj.var++; // increments var 
    return obj; 
} 
+0

這是行不通的,因爲MyClass的構造函數是私有的。 –

+0

@RaymondChen是的。我認爲這是一個錯字。 – juanchopanza

+0

它也使用關鍵字'double'。 –

相關問題