我遇到了一些我不明白的编译器错误。我很确定我在这里做错了但我不知道是什么。我希望将所有世界常量定义为属于该类。
注意:
我只使用类作为附加成员的结构。我并没有故意遵循严格的面向对象设计。请不要评论公共变量。
我并不太关心编译器内联的东西。我正在使用这种结构,因为我很容易使用它。 (如果有效)
class Board{
public:
enum PhysicsResult{ BOUNCE, OUT_OF_BOUNDS_TOP, OUT_OF_BOUNDS_BOTTOM, CONTINUE };
//World constants
const static float Height = 500;
const static float Width = 300;
//ERROR: 'Board::Width' cannot appear in a constant-expression.
const static float PaddleWidth = Width/15;
const static float BallRadius = 5;
const static float BounceDistance = 1.5;
//World Objects
Ball ball;
Paddle paddle1;
Paddle paddle2;
/*
1---2
| |
0---3
*/
//ERROR: a brace-enclosed initalizer is not allowed here before '{' token
//ERROR: invalid in-class initalization of static data member of nonintegral type 'const Pair[4]'
const static Pair corners[4] = {Pair(0, 0), Pair(0, Height), Pair(Width, Height), Pair(Width, 0)};
//ERROR: a brace-enclosed initalizer is not allowed here before '{' token
//ERROR: invalid in-class initalization of static data member of nonintegral type 'const Pair[2]'
const static Pair left_wall[2] = {corners[0], corners[1]};
//ERROR: a brace-enclosed initalizer is not allowed here before '{' token
//ERROR: invalid in-class initalization of static data member of nonintegral type 'const Pair[2]'
const static Pair right_wall[2] = {corners[3], corners[2]};
//ERROR: a brace-enclosed initalizer is not allowed here before '{' token
//ERROR: invalid in-class initalization of static data member of nonintegral type 'const Pair[2]'
const static Pair top_wall[2] = {corners[1], corners[2]};
//ERROR: a brace-enclosed initalizer is not allowed here before '{' token
//ERROR: invalid in-class initalization of static data member of nonintegral type 'const Pair[2]'
const static Pair bottom_wall[2] = {corners[0], corners[3]};
如果可以这样做,那么这样做的正确语法是什么? 如果这不可行,我应该使用哪种替代方案?
答案 0 :(得分:5)
定义类体外部的静态consts,并使用gcc执行。
#include <iostream>
using namespace std;
struct Pair { int a; int b; Pair(int x, int y) : a(x),b(y) {}};
struct F {
static const float blah = 200.0;
static const Pair corners[4];
};
// square boards are so ordinary
const Pair F::corners[4] = { Pair(0,0), Pair(0,1), Pair(2,0), Pair(2,2) };
const float F::blah ;
int main(int, char **) {
cout << F::corners[0].a << endl ;
cout << F::blah << endl;
return 0;
}
我不能过分强调ebo关于初始化顺序的评论的重要性。
答案 1 :(得分:2)
您必须在构造函数初始化列表中初始化const成员。
class blah
{
public:
blah() : _constant( 1 ) { }
private:
const int _constant;
};
答案 2 :(得分:1)
需要在声明之外定义C ++对象的静态成员。这是因为编译器不知道将成员放入哪个翻译单元(.o文件)。
通常我会在实现的.cpp文件中定义它们。您通常不希望将它们放入头文件中,因为它们最终会出现在多个.o文件中,并且会生成编译器错误,因为多次定义了相同的内容。