为什么无法创建在与类定义相同的命名空间中定义的 C++ 类的实例?
Why Can't I create an instance of a C++ class defined in the same namespace as the class definition?
我的一个朋友正在学习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;"answers"字符::John.HPMmax=1;")给出错误"错误:此声明没有存储类或类型说明符"以这种方式在命名空间内设置成员变量是违法的,还是我缺少了其他东西?
命名空间内只允许声明。
这些
John.HPMax = 1;
Characters::John.HPMax = 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作为参数的构造函数。
还有其他方法,使用"工厂方法"或静态类初始化,但这些方法涉及更多。以上内容应该会让你现在就行动起来。
如果需要定义全局变量PlayerStats-John,可以将成员初始化推送到构造函数中。像这样的东西会起作用:
namespace Characters
{
class PlayerStats
{
public:
int HPMax, HPCurrent;
PlayerStats( int hpm, int hpc ) : HPMax(hpm), HPCurrent(hpc) { }
};
PlayerStats John( 1, 1 );
}
这样做:
#include <iostream>
using namespace std;
namespace Characters
{
class PlayerStats
{
public:
int HPMax, HPCurrent;
};
}
int main( void )
{
Characters::PlayerStats John;
John.HPMax = 1;
return 0;
}
相关文章:
- 在命名空间中定义函数还是限定函数
- 使用命名空间时出现多个定义错误
- 如何对命名空间限定类型进行类型定义?
- C++未定义的命名空间
- 命名空间更改函数定义
- 使用命名空间在另一个".cpp"文件中定义
- 在命名空间中声明变量,在 main 中定义它,使其对所有其他文件可见
- 在方法定义中显式指定命名空间
- 在 c++ 中定义命名空间中模板类的友元函数时出现问题
- 与自定义命名空间一起使用时实现 std::error_category、名称解析问题
- 为什么 ADL 优先于'std namespace'中的函数,但等于用户定义命名空间中的函数?
- G++显示关于未定义命名空间的错误
- 定义命名空间内类的构造函数
- 在自定义命名空间下包含一个标头
- 与自定义命名空间的链接失败未解析的外部符号
- 自定义命名空间的链接器错误
- 试图通过using-declaration定义命名空间成员
- 如何正确重载作为用户定义命名空间一部分的模板化类的插入运算符?
- 定义命名空间的变体和__visibility__的含义
- 重新定义命名空间的变量