c++ - 重载构造函数中的成员初始化

标签 c++ c++11 constructor xcode8 list-initialization

我有一个基本的语义相关疑问,我无法得到澄清。在陈述问题之前,我会写下最少的代码来清楚地解释它。

在 Constants.hpp 中

#pragma once
enum class OpenglESVersion{
    OES1,
    OES2
};

在 Cone.hpp 中,我有一个枚举成员

OpenglESVersion esVersion;

Cone.cpp 中以枚举作为参数的重载构造函数定义

Cone::Cone(const OpenglESVersion version) : rotationAngle(0), scale(1), esVersion(version) {}

当我实例化 Cone 对象时,现在在我的 RenderingEngine.cpp 中:

Cone cone(OpenglESVersion::OES2);

语法错误:

No type named 'OES2' in 'OpenglESVersion'

现在,如果我将我的对象实例更新为:

Cone cone{OpenglESVersion::OES2};

现在可以了。

我的编译器是 libc++[支持 c++11 的 LLVM c++ 标准库] ,方言是 c++11[-std=c++11] 我正在使用 XCode。

现在我怀疑: 我通过资源来澄清这个概念。过去,我在学校使用 pre c++11 版本,遵循 2008 年打印的 Bjarne 的 C++ 编程书籍,所以这就是为什么我没有在后来出版的 c++11 书中找到这种“ curl ”初始化语法的原因。

我试过谷歌,但不确定要搜索什么关键字,但后来最常见的主题名称指向“列表初始化”。几乎所有资源都涵盖了 c++11 中这种新语法的优势,但我从来没有弄清楚为什么普通圆括号被视为语法错误,因为那里有很多资源,示例显示也使用圆括号和大括号组合在解释差异时,他们使用的是原始类型的示例,例如:

int x(4);
int x{4};

所以这又没有为我澄清这个概念。现在我来这里是为了了解或获得一些有关适当链接或资源的指导,以解释我的疑问。

  • 我的编译器是否生成了圆括号初始化语法 过时了?
  • 它没有过时但从未在 c++ 中得到支持?
  • 我错误地声明和定义了重载的构造函数?
  • 是否不支持通过圆括号语法初始化成员? 为什么?

编辑: 对于任何重载版本都会发生这种情况,假设构造函数的 int 参数重载版本。

Cone::Cone(const int fooVariable) : fooMember(fooVariable){}

唯一有效的代码是:

Cone cone{8};

我明白了

Expected parameter declarator, Expected ')'

对于 Cone cone(8);

如果出于好奇我在 Cone 类本身的成员函数内部实例化,就像编译器不抛出任何语法或某些错误一样,这种行为不会发生:

void Cone::Test(){
    Cone cone(OpenglESVersion::OES2);
}

编辑更新 2: 我想我还有另一个测试用例,它肯定会缩小范围。所以这是模式:

class RenderingEngine
{
private:
    Cone cone(OpenglESVersion::OES2);
};

所以我将 Cone 对象声明并实例化为 RenderingEngine 类的成员。那么这可能是导致我的问题的原因吗?因为如果我这样做

Cone cone(OpenglESVersion::OES2);

在 RenderingEngine/Outside 类实现的任何成员函数内,它就可以工作。因此,在声明和实例化非基本成员变量的内容和方式方面,我肯定违反了一些基本规则。

最佳答案

成员初始化已在 C++11 中引入。

不支持括号以避免最麻烦的解析,因此您可以使用 {..}= 语法:

class RenderingEngine
{
private:
    Cone cone{OpenglESVersion::OES2};
};

class RenderingEngine
{
private:
    Cone cone = Cone(OpenglESVersion::OES2); // With =, you can use parent on right side
};

关于c++ - 重载构造函数中的成员初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46148009/

相关文章:

c++ - 在 Boost Spirit 中解码字符 UTF8 转义

c++ - 预编译 header 在使用 Qt Creator/qmake/MinGw 的调试版本中不起作用

c++ - 右值函数重载

c++ - 为什么我的代码中 get<>() 分配的值会在构造之外发生变化?

javascript - 使用构造函数循环生成测验问题答案的复选框

c++ - 如何初始化数组指针对象

c++ - 如何区分 C++11 中的填充构造函数和范围构造函数?

c++ - VS2019 : Compiling Cap'nProto Crashes C++ Compiler

c++ - gcc7.3 和 gcc9.3 之间 filesystem::path(filePath).filename() 的不同行为

c++ - 你什么时候使用 std::unordered_map::emplace_hint?