重载构造函数

时间:2017-09-11 04:02:26

标签: 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对象时,现在在My RenderingEngine.cpp中:

Cone cone(OpenglESVersion::OES2);

我收到语法错误:

  

'OpenglESVersion'中没有名为'OES2'的类型

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

Cone cone{OpenglESVersion::OES2};

现在可行。

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

现在我怀疑: 我通过资源来澄清这个概念。在过去,我曾在2004年印刷的Bjarne的C ++编程手册中使用了pre c ++ 11版本,这就是为什么我没有在c ++ 11的书上找到这种“卷曲”初始化语法的原因。

我试过google并且不确定要搜索哪个关键字,但后来最常见的主题名称指向“列表初始化”。几乎所有的资源都涵盖了c ++ 11中这种新语法的优势,但我从未明白为什么正常的圆括号被视为语法错误,因为有许多资源,其中示例显示使用圆形括号和花括号的组合虽然解释了差异,但他们正在使用原始类型的例子,如:

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

因此,这并不是为我澄清这个概念。现在我在这里了解或得到一些解释我怀疑的适当链接或资源的指导。

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

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

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

只有代码才有效:

Cone cone{8};

我得到了

  

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

代表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类实现的任何成员函数内,然后它可以工作。所以必须有一些基本规则,我违反了什么以及如何声明和实例化非原始成员变量。

1 个答案:

答案 0 :(得分:1)

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

不支持使用括号来避免最令人烦恼的解析,因此您可以使用let request = NSMutableURLRequest(url: NSURL(string: "http://servis.dronysitmp.cz/cteni_baterie.php")! as URL) request.httpMethod = "GET" let getString = "a=\(oznaceni)" request.httpBody = getString.data(using: String.Encoding.utf8) let task = URLSession.shared.dataTask(with: request as URLRequest) { data, response, error in if error != nil { print("error=\(String(describing: error))") return } print("response = \(String(describing: response))") let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue) print("responseString = \(String(describing: responseString))") } task.resume() } .. {}语法:

=

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