从类中的对象调用类中函数的最佳方法

时间:2018-06-27 20:28:20

标签: c++ design-patterns

如果这是一个愚蠢的问题,对不起。可以说我有一个类,并且我想使用该类中的一个对象从该类中调用一个函数,以更改该类中的某些内容。例如:

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的整个主题,并需要从许多父对象的许多对象中调用函数时,该怎么办?我需要很多指针,否则可能会有点混乱。

关于解决此类问题的最佳方法的任何建议吗?

谢谢

1 个答案:

答案 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;
};

如您所见,BarFoo一无所知,这确保了loose coupling的组件,现在您可以让Bar的每个实例做完全不同的事情事件发生时。