gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:57:03 25 4
gpt4 key购买 nike

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

在 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/

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