Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在c+中处理正在更改的值+;结构_C++_Struct_Operator Overloading_Detection - Fatal编程技术网

C++ 在c+中处理正在更改的值+;结构

C++ 在c+中处理正在更改的值+;结构,c++,struct,operator-overloading,detection,C++,Struct,Operator Overloading,Detection,我有一个结构描述了如何初始化系统。然后,我有一个方法返回对所述结构的引用,以便最终系统的用户可以在初始化后更改某些选项。我希望检测值何时更改,并告诉系统的组成部分检查它们所依赖的选项,以查看它们是否已更改,并相应地更新它们自己 我相信通过重载操作符或类似的东西,这样的事情是可能的。我并不在乎开销以及检测和更新代码的外观,我只希望更改选项的语法看起来干净,并且用户不必在更改后调用updateOptions()函数 首先,这可能吗?其次,如果是的话,我该怎么做呢?如果我是你,我会在setter函数中

我有一个结构描述了如何初始化系统。然后,我有一个方法返回对所述结构的引用,以便最终系统的用户可以在初始化后更改某些选项。我希望检测值何时更改,并告诉系统的组成部分检查它们所依赖的选项,以查看它们是否已更改,并相应地更新它们自己

我相信通过重载操作符或类似的东西,这样的事情是可能的。我并不在乎开销以及检测和更新代码的外观,我只希望更改选项的语法看起来干净,并且用户不必在更改后调用
updateOptions()
函数


首先,这可能吗?其次,如果是的话,我该怎么做呢?

如果我是你,我会在setter函数中为每个选项发出适当的信号,并让订阅者注册这些信号。为了清晰起见,我将使用类而不是结构,因为您希望所有内容都是私有的,除了公开的信号、setter和getter

“我有一个结构,它描述了系统应该如何初始化。然后我有一个方法返回对该结构的引用,以便最终系统的用户可以在初始化后更改某些选项。”

这可能是错误的方法。最好对单个属性使用getter/setter函数,这样类就可以控制如何对属性更改做出反应


另一种方法是让客户端检索对interned properties
struct
成员变量的
const
引用,复制该变量,更改该变量,并使用setter(update)函数将其传回。这将使客户端的过程更加清晰,而不必调用额外的
update()
函数。

在许多情况下,更改单个项目可能会导致整个设置无效,但更改2或3可能是有效的设置

如果是这种情况,您可以创建一个
getter/setter
函数对。
getter
函数将返回结构的副本,
setter
函数将实际上是一个updateSetting函数


它的开销非常小,并且比每个项目都有一个getter/seeter更健壮。

我假设您的结构名为
Fun

解决方案1:添加getter、setter和notify

我将为所述结构的每个属性编写一个getter和setter。它看起来是这样的:

struct Fun {
    Fun(System& sys): system{sys} {}

    void setGun(int g) {
        gun = g;
        notify();
    }

    int getGun() {
        return gun;
    }

    void notify() {
            system.updated();
    }

private:
    System& system;
    int gun;
};
当然,引用可以是指针,当然,您必须将结构与头文件和cpp文件分开

解决方案2:为结构乐趣编写get和set

这个解决方案的优点是它可能是最快的,当然也是最干净的

struct System {
    void setFun(Fun f) {
        if (f != fun) {
            // update only if different
            updated();
        }
        // it may be faster if Fun allocates resources
        fun = move(f);
    }

    // do not return by reference
    Fun getFun() const {
        return fun;
    }

private:
    Fun fun;
};

重载操作符与此无关(至少,从根本上说不是),检测何时发生事件完全取决于您在系统中传递事件和处理事件的方式。当我不了解你的系统时,我不能告诉你怎么做。但是,有可能吗?当然可以。观察操作符==,观察者模式,boost信令的可能重复。我不知道这如何让你“清晰”。默认情况下,结构中的所有内容都是公共的,所以我会发现,如果在这样的情况下使用它,并且有很多私有逻辑,那么就不清楚了。那又怎样?把这个逻辑保密。不过这是一个很好的提升信号的建议。我特别想避免使用二传手。我更喜欢像'options.windowTitle=“我的窗口!”;`如果我没说清楚,很抱歉。@Luke:我没看到。“结构”与“类”相比没有什么区别。关键字
struct
class
都定义了“类”。字面上是同一个实体。不知道为什么人们会为这两件事大惊小怪!!在我看来,不同的默认访问说明符并没有提供更多的“清晰性”。耸肩