gpt4 book ai didi

c++ - 最好用正确的值实例化对象然后推送到 vector ,或者实例化,推送到 vector 然后设置正确的值?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:32:54 25 4
gpt4 key购买 nike

假设我有这样一个类:

class Foo{
Foo* otherFooObj;
Foo* otherFooObj2;
.....
};

是否会更好:

一个。

  1. 使用函数获取成员变量的正确值(otherFooObjotherFooObj2 等的地址)
  2. 用这些正确的值实例化(构造)一个 Foo 对象。
  3. 将对象推向 vector 。

B.

  1. 用虚拟值实例化一个 Foo 对象(otherFooObjotherFooObj2 的虚拟地址)
  2. 将对象推向 vector 。
  3. 使用函数将 Foo 对象的成员变量设置为正确的值,一旦它位于 vector 中。

C.

  1. 用虚拟值实例化一个 Foo 对象
  2. 使用函数获取正确的值并将Foo的成员变量设置为这些值
  3. 将对象推向 vector 。

现在,我认为这些设计模式之间没有太大区别,我遵循哪个流程并不重要。但我想就此获得更多意见,并想知道是否有任何其他因素我忽略了,我应该考虑(我觉得有,可能有指针等)。

最佳答案

这个问题太笼统了,不好回答。一个好的设计目标是只让对象处于有效 状态,根据您设计中有效的某种定义。另一种方法是不能事先相信一个对象处于有效状态,这会使您的生活变得复杂,并导致您误以为 半生不熟 对象存在于周围。

从这个角度来看,我会为成员创建值并调用构造函数将对象从不存在状态移动到有效状态。

在您的情况下,您似乎正在构建一个自引用数据结构:图形、树或类似的东西。如果是这种情况,则两个成员设置为 nullptrFoo 可能是有意义的,您可以考虑替代方案,但我仍然会提供一个构造函数使您能够将对象设置为完整状态:

class Foo {
Foo *a, *b;
public:
Foo() : a(), b() {} // initialize both to nullptr, assuming this is a *valid* state
Foo(Foo *a, Foo *b) : a(a), b(b) {}
...
};

回到最初的问题,我会选择为成员创建值并放置到 vector 中:

Foo *a = f();
Foo *b = f();
vector.emplace_back(a, b);

关于c++ - 最好用正确的值实例化对象然后推送到 vector ,或者实例化,推送到 vector 然后设置正确的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27195852/

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