成员初始化超载构造函数

Member Initialization in overloaded constructor

本文关键字:构造函数 超载 初始化 成员      更新时间:2023-10-16

我有一个基本的语义相关疑问,我无法澄清。在说明问题之前,我将写下最低代码以清楚地解释它。

instants.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) {}

现在在我的renderingengine.cpp中实例化锥对象时:

Cone cone(OpenglESVersion::OES2);

我得到语法错误:

在" openglesversion"中没有名为'oes2'的类型

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

Cone cone{OpenglESVersion::OES2};

现在起作用。

我的合格器是libc [llvm C 标准库带有C 11支持],方言为C 11 [-STD = C 11]我正在使用Xcode。

现在我怀疑了:我经历了资源来澄清这个概念。过去,我曾在Bjarne的C 编程书上使用C 11版本,该版本于2008年印刷,所以这就是为什么我在C 11的书中没有找到此"卷曲"初始化语法的原因。

我尝试了Google,但不确定要搜索的关键字,但后来最常见的主题名称指向"列表初始化"。几乎每个资源都涵盖了C 11中这种新语法的优势,但我从未澄清过为什么将正常的圆形支架视为语法错误,因为那里有许多资源,示例显示了使用圆形支架和卷发括号组合的示例显示在解释差异的同时,但是他们使用的是原始类型的示例,例如:

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

因此,这并没有为我澄清这个概念。现在,我在这里知道或有一些指导来解释我的疑问的适当链接或资源。

  • 我的编译器制作了该圆形括号Intialization语法过时?
  • 它不是过时的,但在C 中从未支持?
  • 我已经声明并定义了过载的构造函数?
  • 是否通过圆形支架语法支持不支持成员的初始化?为什么?

编辑:这对于任何超载版本都会发生,可以说int参数超载构造函数。

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

只有代码工作是:

Cone cone{8};

我得到

预期参数声明器,预期')'

Cone cone(8);

如果好奇心我在圆锥类本身的成员函数内实例化,就像编译器不会引起任何语法或某些错误:

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

编辑更新2:我认为我还有另一个测试案例,肯定应该缩小。所以这是模式:

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

所以我声明并实例化锥体对象为RenderingEngine类的成员。那是因为这引起了我的问题吗?因为如果我做

Cone cone(OpenglESVersion::OES2);

在RenderingEngine/外部类实现的任何成员功能中,它都可以正常工作。因此,我必须有一些基本规则,即我违反了什么以及如何声明和实例化的非启示成员变量。

成员初始化已在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
};