编译器给出的错误:“不命名一个类型”立即宣布后

编译器给出的错误:“不命名一个类型”立即宣布后

问题描述:

我有一个代码块从我的项目中用ncurses构建一个C++ roguelike。我试图让玩家可以握住两把武器。我已经创建了一个weaponItem类和两个对象,但是编译器仍然会抛出'不会命名类型'的错误。编译器给出的错误:“不命名一个类型”立即宣布后

代码:

weaponItem weapon1; 
weaponItem weapon2; 

weapon1.setType(DMW_DAGGER); 
weapon2.setType(DMW_SBOW); 

weapon1.setPrefix(DMWP_AVERAGE); 
weapon2.setPrefix(DMWP_RUSTY); 

编译器错误:

In file included from main.cpp:2:0: 
hero.h:17:2: error: ‘weapon1’ does not name a type 
    weapon1.setType(DMW_DAGGER); 
^
hero.h:18:2: error: ‘weapon2’ does not name a type 
    weapon2.setType(DMW_SBOW); 
^
hero.h:20:2: error: ‘weapon1’ does not name a type 
    weapon1.setPrefix(DMWP_AVERAGE); 
^
hero.h:21:2: error: ‘weapon2’ does not name a type 
    weapon2.setPrefix(DMWP_RUSTY); 
^

有什么问题我的类或对象的声明?

+0

您不能在名称空间范围内执行代码。 –

+0

weaponItem类型是在另一个头文件中声明的,这个头文件包含在我展示的文件的顶部。 –

+0

你不能在头文件中放置可执行代码(比如'weapon1.setType(DMW_DAGGER);')。 C++中的可执行代码必须在函数中。 –

我想你是误解了错误信息和一些评论。

假设你有一个类/结构。

struct Foo 
{ 
    Foo() : a(0) {} 
    void set(int in) { a = 10; } 
    int a; 
}; 

您可以在函数定义的外部定义Foo类型的对象。

// OK 
Foo foo1; 

但是,您不能自己调用​​函数定义之外的类的成员函数。

// Not OK in namespace scope or global scope. 
foo1.set(20); 

您可以在文件中的函数定义中进行函数调用。

// OK. 
void testFoo() 
{ 
    foo1.set(20); 
} 

如果您使用其返回值来初始化另一个变量,则可以在函数定义之外调用成员函数。

struct Foo 
{ 
    Foo() : a(0) {} 
    void set(int in) { a = 10; } 
    int get() { return a; } 
    int a; 
}; 

// OK 
Foo foo1; 
int x = foo1.get(); 
+0

这清理了很多。我忘了我试图在主函数之外执行代码。感谢解释它,但我仍然不得不问为什么我的函数必须嵌套在另一个? –