Type: Note
class 宣告member時
若該member的型態並非指標
則該member的型態必需事先就定義完整
如下例, compile是會失敗的
class Personality; class Human{ Personality p; } class Personality{ string name; }因為它必須先計算 Human class 的 memory 大小
但他卻還不知道 Personality class 的 size, 所以無從計算
如果改成指標型態 就沒有問題, 因為指標大小是固定的
class Personality; class Human{ Personality *p; } class Personality{ string name; }在使用 include 時要注意這點
Java 和 C# 沒有這問題, 因為 class 都是以指標型態儲存
----------------------------------
實例上來看, 我們會像下面這樣宣告 形成不完全的型態
//Human.h #ifndef HUMAN_H_ #define HUMAN_H_ #include "project.h" class Human{ Personality p; } #endif
//Personality.h #ifndef PERSONALITY_H_ #define PERSONALITY_H_ #include "project.h" class Personality{ string name; } #endif
//project.h #include "Human.h" #include "Personality.h"這就會導致上述提到的不完全型態
"#define PERSONALITY_H_" 後, 接著引入 project.h
此時的 Personality class 尚未宣告 or 尚未完成宣告
project.h 引入 Human.h
Human class 宣告, 但無法計算size, 因為 Personality class 未完成
沒有留言:
張貼留言