gpt4 book ai didi

c++ - 我应该如何构造相互依赖的C++成员?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:47:42 28 4
gpt4 key购买 nike

我有一个使用库进行通信的类:

class Topic {
Topic( Type T, String name );
};

class Reader {
Reader (Topic, String name);
};

class Writer {
Writer (Topic, String name);
};

我想做一个这样的说话者类:

Talker (Type T, String name);

并通过构造函数生成成员Writer和Reader。

我在用指针做这件事之间左右为难:

class Talker {
Topic* m_Topic;
Reader* m_Reader;
Writer* m_Writer;

Talker (Type T, String name) {
m_Topic = new Topic (T, generateTopicName(name));
m_Reader = new Reader (m_Topic, generateReaderName(name));
m_Writer = new Writer (m_Topic, generateWriterName(name));
}
};

直接对战:

class Talker {
Topic m_Topic;
Reader m_Reader;
Writer m_Writer;


Talker (Type T, String name) :
m_Topic(T, name),
m_Reader(m_Topic, generateReaderName(name)),
m_Writer(m_Topic, generateWriterName(name))
{}
};

我正在和一位同事交谈,显然后者很糟糕,因为它依赖于成员初始化顺序。但是,它还有一个工作的自动复制构造函数。

处理此类问题的更好方法是什么,尤其是当成员对象列表变长时?

最佳答案

像这样的决定不应该基于你同事建议的论点,因为它是一个无效的论点。您甚至可以控制对象成员的初始化顺序 - 请参阅我的最后一段。该决定应基于:

1) Functional - 您需要多态类型吗? TopicReaderWriter会被继承吗?如果是,则应使用指针来防止对象切片。

2) 逻辑 Talker 是成员(对象)的真正拥有者还是仅仅指向一些在多个类之间共享的对象?

旧答案

另一种方法是使用智能指针作为成员。这样您仍然拥有自动内存管理的优势。

但是,如果您了解您的 C++,您同事的论点是无效的,后一种选择也不错。成员按照它们在 class 中声明的顺序进行初始化。所以 m_Topic 将首先被初始化,m_Reader 其次,最后是 m_Writer。如果初始化顺序很重要(代码味道),只需重新排序类定义中的成员即可。

关于c++ - 我应该如何构造相互依赖的C++成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9877926/

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