我是C ++和OOP的新手,并且一直在尝试学习高效或“正确”的做事方法,但仍然遇到麻烦。
我正在创建一个DataStore类,其中包含其他类/对象的数据。此类将永远只有一个实例/对象;但是,因为它是全局数据,所以实际上并不需要对象/实例。在这种情况下,我觉得这只是提供范围的一种方式。因此,我想直接更改类成员,而不是传递对象。我已经阅读了有关static和_extern的信息,但是我无法确定它们是否可行,或者是否还有其他更好的选择。
现在,我正在传递一个创建的对象以更改其数据,但是我宁愿将该类作为“自身”而不是“自身的实例”进行访问,同时仍然保留将其作为对象的想法。
编辑:在注释OP中,解释了数据存储将由在多个线程中运行的代码读取,并由一个线程中的代码更新。我以前的答案不再适用。这是一个更好的答案。
不要使用全局变量来保存商店的实例。这将打开许多可能困扰您很长时间的细微错误的大门。您应该为您的阅读线程授予对商店的只读访问权限。您的写入线程应获得读写访问权限。
确保您在数据存储区中的读取方法已正确标记为const
。然后创建数据存储的单个实例,并将指向它的指针放在const
全局变量中。您的编写线程应该具有获取非常量指针的另一种机制(GetInstance
如@Mats所建议的,添加一个公共静态方法)。
我以前的回答:如果您确定始终只有一个数据存储实例,请不要将其传递出去。
全局变量不受欢迎,某些语言(Java和C#)完全禁止使用它们。因此,在C#和Java中,您改为使用静态类成员,它们实际上是同一件事(存在完全相同的问题)。
如果可以将单个实例放在const
全局变量中,那应该没问题。
如果您正在执行任何类型的多线程处理,则需要确保您的存储区是线程安全的,否则确实会发生不好的事情。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句