gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:32:05 25 4
gpt4 key购买 nike

好的,如果这是一个愚蠢的问题,我很抱歉。假设我有一个类,我想使用该类中的对象调用该类中的函数来更改类中的某些内容。例如:

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 实现类似的东西,例如我可以单击侧边栏中的按钮,这反过来会改变父级(主要 window )。在这种情况下它可能不会太糟糕,但是当我想要更改 UI 的整个主题并且需要调用来自许多父级的许多对象中的函数时怎么办。我需要很多指导,而且它可能会变得有点困惑。

关于解决此类问题的最佳方法有什么建议吗?

谢谢

最佳答案

最合适的方法是使用 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 对确保 loose couplingFoo 一无所知。您的组件,现在您可以让 Bar 的每个实例在事件发生时做完全不同的事情。

关于c++ - 从类中的对象调用类中函数的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51070925/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com