2015-06-11 44 views
2

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

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

首先,这甚至有可能吗?其次,如果是这样,我会怎么做呢?

+1

重载运营商没有任何与此有关的(至少,没有从根本上),并且检测_when_有事完全取决于你如何绕过您的系统事件和处理它们。当我不知道你的系统时,我无法告诉你该怎么做。但是,这可能吗?当然。 –

+0

[观察成员变量值的变化]的可能的副本(http://stackoverflow.com/questions/10880253/observing-change-in-value-of-member-variable) – Kyle

+0

看看运算符==,观察者模式,为初学者提供增强信号。 – Bathsheba

回答

0

我会假设你的结构被命名为Fun

解决方案1:添加getter,setter和通知

我会写一个getter和上述结构的各个性能的制定者。它应该是这样的:

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:写一个取得和结构玩转

这个解决方案的优点集为,这可能是最快的,当然最干净的一个。

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; 
}; 
0

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

+2

我不明白这是怎么给你“清晰”。 –

+0

默认情况下,一切都在公共结构中,所以我会发现它不清楚它是否在像这样的情况下使用了很多私有逻辑。 – Luke

+1

那又如何?使该逻辑保密。不错的建议提升信号。 – Bathsheba

0

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

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

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

1

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

如果是这种情况,您可以创建一个getter/setter函数对。 getter函数将返回结构的一个副本,而setter函数将有效地成为updateSetting函数。

这个开销非常小,比每个项目有一个getter/seeter更强大。