如果这是一个愚蠢的问题,对不起。可以说我有一个类,并且我想使用该类中的一个对象从该类中调用一个函数,以更改该类中的某些内容。例如:
class Foo;
class Bar{
public:
Bar(Foo *parent): parent(parent) {}
void barClickEvent(){
parent->changeSomething(10);
}
private:
Foo * parent;
};
class Foo {
public:
Foo():bar(this), something(5) {}
void changeSomething(int x){something = x;}
private:
Bar bar;
int something;
};
我创建了一个Foo类型的对象(它会自动创建一个Bar类型的对象)。为了让所有Bar访问Foo中的功能,我传递了一个指向Bar的指针,该指针指向Foo(其父级)。这是最有效的方法吗?
之所以这样问,是因为我正在为某些软件的GUI实现与此类似的功能,例如,我可以单击侧边栏中的按钮,从而改变父级的颜色(主窗口)。在这种情况下,它可能还不错,但是当我想更改UI的整个主题,并需要从许多父对象的许多对象中调用函数时,该怎么办?我需要很多指针,否则可能会有点混乱。
关于解决此类问题的最佳方法的任何建议吗?
谢谢
答案 0 :(得分:2)
最合适的方法是使用observer pattern。想法是将功能对象传递给事件的源。这将确保您能够为事件设置任何动作,而事件的来源不知道其确切含义。
在C ++中实现此目的的最简单方法是使用std::function
类。例如:
#include <functional>
class Bar {
public:
using OnClicked = std::function<void(int)>;
void onClicked(OnClicked callback) {
m_OnClicked = std::move(callback);
}
void barClickEvent() {
if (m_OnClicked)
m_OnClicked(10);
}
private:
OnClicked m_OnClicked;
};
class Foo {
public:
Foo() : something(5) {
bar.onClicked([this](int value) {
changeSomething(value);
});
}
void changeSomething(int x){something = x;}
private:
Bar bar;
int something;
};
如您所见,Bar
对Foo
一无所知,这确保了loose coupling的组件,现在您可以让Bar
的每个实例做完全不同的事情事件发生时。