Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.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++ - Fatal编程技术网

C++ 给一个对象一个指向“的指针”是否可以接受;世界;?

C++ 给一个对象一个指向“的指针”是否可以接受;世界;?,c++,C++,我经常发现自己处于对象需要相互通信的情况下。例如,按钮可能需要与各种文本框对话。简单地用指向所有小部件容器的指针构造每个小部件是否合适?给它一个指向资源容器映射的指针会更好吗?在这个映射中,对象可以通过字符串或其他方式定位另一个对象?这个领域对我来说一直很模糊。如果我只是用指向每个其他对象的容器的指针构造对象,我可以轻松地实现我想做的所有事情,但这似乎是错误的。在小部件的情况下,如果小部件对外部世界一无所知,而它的操作侦听器是通过资源访问构建的,那么它实际上会更合适吗 谢谢 我知道这是个坏主意,

我经常发现自己处于对象需要相互通信的情况下。例如,按钮可能需要与各种文本框对话。简单地用指向所有小部件容器的指针构造每个小部件是否合适?给它一个指向资源容器映射的指针会更好吗?在这个映射中,对象可以通过字符串或其他方式定位另一个对象?这个领域对我来说一直很模糊。如果我只是用指向每个其他对象的容器的指针构造对象,我可以轻松地实现我想做的所有事情,但这似乎是错误的。在小部件的情况下,如果小部件对外部世界一无所知,而它的操作侦听器是通过资源访问构建的,那么它实际上会更合适吗

谢谢


我知道这是个坏主意,但在这些情况下有什么解决方案,例如:好的设计模式?

答案取决于对象可能存在的时间和指针可能存在的时间。任何可能更改的内容都需要通过目录服务。如果目标的生命周期足够短,您甚至可能需要目录服务在目标上挂起。

任何对象都应该尽可能少地了解自身之外的事情。您所描述的内容听起来很像ani模式,通常被称为


如果使用消息/事件,可以更好地解耦合。

不要这样做

不,说真的,您的想法与模式类似,不同之处在于每个“名称”只有一个实例,而不是每个类型

你可以通过观察单身人士的问题来收集你想法中的一些不好的东西

对象的容器,但这似乎是错误的

为什么你认为这是错误的

通常,您不仅需要发送消息,还需要执行导航/枚举之类的操作

例如,HTML DOM树由节点组成,其中每个节点都包含对其父节点的[弱]引用。没有像nextSibling()这样的引用操作是不可能的


所以答案取决于您想要在那里实现的一组其他操作。

为什么对话框中的按钮(?)想要知道对话框中还有多少其他对象


按下按钮时,会向其所有者发送一条消息。然后,所有者必须协调其拥有的小部件之间的操作。当对话框获得另一个列表框时,您不想更改“确定”按钮的代码,是吗?

您可以使用依赖项注入来传递所需的指针。这样,就可以明确依赖关系

这种方法给了您很多好处——当您没有全局状态、god对象等时,单元测试就容易多了。另外,当新成员加入团队时,他可以看到类的依赖关系是什么——你可以在构造函数中显式地定义它,所以没有“你必须首先创建这个单例来使用这个对象,否则它会崩溃”这样的魔法。这种方法减少了耦合,从而使重用更容易

在我看来,不可能使每个类都独立于所有其他类(当widget对外部世界一无所知时,您会问这样是否更好)。虽然这消除了耦合,使代码重用更容易,但这也很难做到,并导致更多的编码

另一方面,在不了解原因的情况下“仅仅因为”追求某种意识形态是个坏主意。也许在您的情况下,OOP的优点不值得编写额外的代码。如果你能看到使用“god object”可以更快地完成应用程序,那么我会说“加油”

在我看来,这并不像“永远不要创建单一对象和上帝对象”那么简单。您必须决定在传递所有引用上花费的额外时间是否会在将来得到回报


就我个人而言,我总是选择适合我编写的程序的内容。对我来说,有意识地打破一些OOP规则并不罕见。请记住还有其他指导原则-我喜欢KISS。

不确定这是否是一个问题,这可能是程序员的问题。stackexchange.com请尽量避免:既然我们有“递归类型”,那么把所有可能的对象都放在一个表中就可以了?这个论点不能说服我。