網頁

2014年12月7日 星期日

C++ member declare has incomplete type

Last Update: 2014/12/08 13:42+08
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 未完成



沒有留言:

張貼留言