我有一个基本的语义相关疑问,我无法澄清。在陈述问题之前,我会写下最低限度的代码来清楚地解释它。
在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};
因此,这并不是为我澄清这个概念。现在我在这里了解或得到一些解释我怀疑的适当链接或资源的指导。
编辑: 对于任何重载版本都会发生这种情况,让我们说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类实现的任何成员函数内,然后它可以工作。所以必须有一些基本规则,我违反了什么以及如何声明和实例化非原始成员变量。
答案 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};
};