2014-05-12 73 views
-3
Diagram *p[3]; 
p[0] = new Diagram; 
p[1] = new Board; 
p[2] = new Pacman; 

我聲明基類的指針全球範圍內,同時,我初始化指針與派生類,但是,如果我在全球做給出了一個錯誤,但不當我在Display()函數中聲明指針時。錯誤:C++需要一個類型說明符的所有聲明OOP

clang++ -c -o game-release.o game-release.cpp 
game-release.cpp:42:1: error: C++ requires a type specifier for all declarations 
p[0] = new Diagram; 
^ 
game-release.cpp:43:1: error: C++ requires a type specifier for all declarations 
p[1] = new Board; 
^ 
game-release.cpp:44:1: error: C++ requires a type specifier for all declarations 
p[2] = new Pacman; 
^ 
3 errors generated. 
make: *** [game-release.o] Error 1 
+1

哪個'Display()'函數?你能提供更多的背景嗎?另外,您可能想要添加編譯器錯誤消息。 – evnu

+0

@envu clang ++ -c -o game-release.o game-release.cpp game-release.cpp:42:1:error:C++需要所有聲明的類型說明符 p [0] = new Diagram; ^ game-release.cpp:43:1:error:C++需要所有聲明的類型說明符 p [1] = new Board; ^ game-release.cpp:44:1:error:C++需要所有聲明的類型說明符 p [2] = new Pacman; ^ 生成3個錯誤。 make:*** [game-release.o]錯誤1 – Shaan

+0

請編輯您的問題並在那裏添加輸出。它增強了可讀性。 – evnu

回答

1

你不能在全局範圍內進行賦值 - 你只能在那裏有聲明和定義。
這就是編譯器說「C++需要所有聲明的類型說明符」的原因。
(編譯器,p[0] = new Diagram;必須聲明,因爲它是在全局範圍內。)

分配有一個功能去的,因爲你已經注意到了。

可以在聲明初始化直列不過,像這樣:

Diagram *p[3] = { new Diagram, new Board, new Pacman }; 
+0

雖然這種聲明全局指針的方式是正確的,爲什麼不是p [3],即Pacman類(派生的)不提供在Pacman類中定義的函數?我把它寫成像這樣的p [2] - >,但它不允許派生類的函數Pacman – Shaan

+0

@Shaan因爲當你有一個指向一個'Diagram'的指針時,編譯器無法知道它指向一個'Pacman '。閱讀你書中有關多態的章節。 – molbdnilo

1

雖然OK聲明並在全球範圍內的變量,你不能分配給這些變量。當您提醒自己全局範圍只能包含聲明時,這可能會變得更清晰。您需要一次申報並初始化

Diagram *p[3] = {new Diagram, new Board, new Pacman}; 

或在運行時調用專用函數來分配元素。