gpt4 book ai didi

c++ - 在构造对象之前使用对象成员

转载 作者:太空宇宙 更新时间:2023-11-04 13:53:09 26 4
gpt4 key购买 nike

我有以下简单代码:

#include <iostream>
#include <vector>

template <class Derived>
struct Base
{
Base()
{
static_cast<Derived*>(this)->foo();
}

std::vector<int> m_ints;
};

struct Derived : Base<Derived>
{
Derived() : Base()
{
std::cout << a;
}

void foo()
{
m_ints.push_back(37);
a = 4;
}

int a;
};

int main()
{
Derived d;
return 0;
}

我知道创建对象时调用构造函数的顺序。构造函数从“最基础->向下”调用。所以在 Base constructor Derived 对象没有完全构造。

1) 安全吗,调用Derived::fooBase构造函数,当Derived::foo请勿触摸 Derived目的?我的意思是,当没有 a = 4 这样的行时, 只是触摸 Base对象。

2) 如果我运行发布的代码,它确实有效,尽管我正在触摸 a当时不应该存在。能保证工作吗? (我在 VS2013、VS2010 和 GCC 4.8.1 on Ideone 上测试过)

最佳答案

它会在这种特定情况下起作用,但我建议不要这样做。代码中的细微变化可能会突然破坏逻辑(例如,有人将方法 foo 设为虚拟,有人在构造函数或 Derived 中初始化数据成员 a,...)。

如果基类需要来自派生类的信息,那么派生类必须将该信息传递给基类的构造函数。在这个类中,值 37 应该从 Derived 的构造函数传递给 Base 的构造函数。

并且当必须初始化数据成员a时,在Derived的构造函数中初始化它,而不是在其他地方。

编辑:在 C++11 中,如果 Derived 类想要在 Base 的构造函数中注入(inject)代码,它可以将 lambda 传递给 Base。然后 Base 在其构造函数中简单地执行 lambda。

关于c++ - 在构造对象之前使用对象成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22682321/

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