成员初始化超载构造函数
Member Initialization in overloaded constructor
我有一个基本的语义相关疑问,我无法澄清。在说明问题之前,我将写下最低代码以清楚地解释它。
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
};
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 构造函数超载以接受任何功能
- 构造函数超载和Sfinae
- 在C 构建器中超载Mainform构造函数
- 超载构造函数中的未指定字段
- 使用超载运算符添加构造函数
- C 垃圾成员值时使用公共和私人超载构造函数
- 为什么在C 中超载邮政增量运算符两次调用构造函数
- 为什么调用超载构造函数会导致默认构造函数的调用
- C 17:始终调用用户定义的构造函数,并且运算符 超载不适用于儿童课程
- 超载构造函数不适用于单个链接列表
- 成员初始化超载构造函数
- 构造函数超载产生混乱
- 将复制构造函数超载与DELETE,然后调用C 子类的默认构造函数
- 类构造函数,超载构造函数和对象初始化
- C :类 - 超载构造函数 - 单个变量
- 使用超载构造函数分配