當使用封裝和「告訴,請不要問」原則正確,應該沒有理由要求從一個對象的信息。 但是,我碰到一種情況(讓我知道這個設計本身是否可怕),我有一個帶有指向該類之外的函數的成員變量的對象。對象需要讓函數訪問其所有數據
在我的應用程序的某些時候,有一個需要我的對象,然後在功能和功能應該採取行動根據我的對象的狀態來調用。
下面是一個例子類:
typedef void(*fptr)(Foo*);
class Foo {
public:
Foo(string name, fptr function);
void activate()
{
m_function(this);
}
private:
string m_name;
fptr m_function;
};
那類,現在開發者可以使用類像這樣;
void print(Foo *sender)
{
cout << "Print works!" << endl;
}
int main(int argc, char **argv)
{
Foo foo("My foo", &print);
foo.activate();
// output: "Print works!"
}
這一切都正常,但如果我想打印發件人的名稱呢? 所有函數都是由其他開發人員在類之外定義的,因此無法訪問私有變量。 在C#
中,您可以使用partial
關鍵字將方法添加到現有類。 雖然這不可能在C++
。
我可以忽略封裝和創造name
一個setter和getter和可能在將來的功能所需要的所有其他屬性。 這是非常糟糕的解決方案,我應該基本上爲我的課程中的所有內容創建setter和getter,因爲函數可以對我的對象執行任何操作。 除了封裝的原因,如果我只是想忽略它,當我想?
的其他解決辦法是持有它裏面所需要的性能的結構:
struct FooBar {
string name;
};
typedef void(*fptr)(FooBar);
void Foo::activate()
{
FooBar fb;
fb.name = m_name;
m_function(fb);
}
但這並不是由於沒有使用封裝太大的不同,它似乎並不像一個太好的解決辦法。 這個問題最好的辦法是什麼?
請參閱[這個老問題](http://stackoverflow.com/questions/1568091/why-use-getters-and-setters)。 –
@JoachimPilborg我認爲他正試圖*避免* getters和setter,而不是試圖找到使用它們的理由。 – 2013-06-05 12:27:43
如果你只需要觀察數據,那麼讓吸氣劑和無吸附劑似乎是最好的解決方案。您希望數據是公開還是私密。能夠訪問由任何人創建的函數中的數據可以有效地公開數據。 –