2015-06-22 28 views
-2

我有一個代碼塊從我的項目中用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++中的可執行代碼必須在函數中。 –

回答

1

我想你是誤解了錯誤信息和一些評論。

假設你有一個類/結構。

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

這清理了很多。我忘了我試圖在主函數之外執行代碼。感謝解釋它,但我仍然不得不問爲什麼我的函數必須嵌套在另一個? –

相關問題