1

我的一个朋友正在学习 C++,我一直在帮助他。我们都使用 Visual Studio 2010。

以下代码给出了错误:

#include <iostream>
using namespace std;

namespace Characters
{
    class PlayerStats
        {
        public:
            int HPMax, HPCurrent;
        };
    PlayerStats John;
    John.HPMax = 1;
    Characters::John.HPMax = 1;
}

行“PlayerStats John;” 似乎解决得很好,但是(“John.HPMax = 1;”和“Characters::John.HPMax = 1;”)之后的行给出错误“错误:此声明没有存储类或类型说明符”是以这种方式在命名空间内设置成员变量是非法的,还是我还缺少其他东西?

4

4 回答 4

3

命名空间内只允许声明。

这些

 John.HPMax = 1;
 Characters::John.HPMax = 1;

不是声明。

于 2013-08-25T16:48:15.553 回答
1

赋值语句只允许在函数中使用(包括构造函数或析构函数作为特殊类型的函数)。大多数“可执行”语句都是如此。命名空间对此无关紧要。没有它们,或者在类或结构内部(但不在内联函数体中),这些分配将是非法的。

在函数之外只允许声明,因此如果您需要初始化 John 实例的这些成员,那么您必须使用某种初始化程序。

由于该类(到目前为止)只有公共数据成员,没有构造函数或虚拟方法,因此您可以将成员初始化与花括号列表一起使用:

PlayerStats John = {2, 1}; // sets HPMax=2 and HPCurrent=1

这种类通常被描述为结构,通常只用于非常小的、简单的对象。数据成员按照声明的顺序进行初始化。

更面向对象的方法是使用构造函数。:

class PlayerStats
{
public:
    int HPMax, HPCurrent;
    PlayerStats(int max) : HPMax(max), HPCurrent(max) {}
};

// define an instance of PlayerStats, with max HP of 1:
PlayerStats John(1);

如果您拥有或可以定义一个接受您需要初始化的信息的构造函数,这将起作用。您不能让两个不同的构造函数采用相同数量和类型的参数,因此构造函数必须是唯一一个只接受一个 int 作为其参数的构造函数。

还有其他方法,使用“工厂方法”或静态类初始化,但涉及更多。以上应该让你现在开始。

于 2013-08-25T17:54:27.927 回答
1

如果您需要定义全局变量 PlayerStats John,您可以将成员初始化推送到构造函数中。像这样的东西会起作用:

namespace Characters
{
    class PlayerStats
    {
    public:
        int HPMax, HPCurrent;
        PlayerStats( int hpm, int hpc ) : HPMax(hpm), HPCurrent(hpc) { }
    };
    PlayerStats John( 1, 1 );
}
于 2013-08-25T17:39:51.320 回答
0

像这样做:

#include <iostream>
using namespace std;

namespace Characters
{
    class PlayerStats
        {
        public:
            int HPMax, HPCurrent;
        };
}

int main( void )
{
    Characters::PlayerStats John;
    John.HPMax = 1;
    return 0;
}
于 2013-08-25T17:26:34.090 回答