#ifndef A_HPP_
#define A_HPP_
#include "B.hpp"
class A
{
public:
//B* bpt;
A();
virtual ~A();
private:
B* bpt;
};
#endif /*A_HPP_*/
=========================================
#include "A.hpp"
#include "B.hpp"
A::A()
{
}
A::~A()
{
}
========================================
#ifndef B_HPP_
#define B_HPP_
#include "A.hpp"
class B
{
public:
//A* apt;
B();
virtual ~B();
private:
A* apt;
};
#endif /*B_HPP_*/
=======================================
#include "B.hpp"
#include "A.hpp"
B::B()
{
}
B::~B()
{
}
即使寫了,#ifnde,#define,#ifndef也無法解決Multiple Inclusions的問題?錯誤資訊如下:
error: ISO C++ forbids declaration of ‘A’ with no type
error: expected ‘;’ before ‘*’
真是非常的奇怪,不過只要使用pre-declare(forward declar)就可以了(如下)。有誰可以告訴我為什麼嗎?
#ifndef B_HPP_
#define B_HPP_
class A;
#include "A.hpp"
class B
{
public:
B();
virtual ~B();
private:
A* apt;
};
#endif /*B_HPP_*/
相關文章:千萬別把function definition & 變數definition寫入.h裡
fe-tool
訂閱:
張貼留言 (Atom)
Buddhism and Software Developer
In today's fast-paced society, we are often surrounded by work, goals, and external pressures. However, the wisdom found in Buddhism off...
-
如果你平時在玩線上遊戲或是工作中經常需要大量點擊滑鼠,那麼一定有大量點擊滑鼠的經驗,非常浪費時間與精力!這個小程式可以讓您免於在做這些無意義的工作了! MouseClick可以依據使用者需求設定點擊的頻率(毫秒)。並且在2.0版可以讓使用者自由選擇滑鼠左鍵,右鍵,中鍵的點擊...
-
如果你忘記即時通的密碼,MessenPass是一個可以顯示儲存在你電腦的密碼的軟體。他可以破解的密碼相當多種,可見下列表。 MSN Messenger Windows Messenger (In Windows XP) Windo...
-
Abstract The DrivingDirection package (com.google.googlenav.DrivingDirection) is removed since Android SDK 1.1. However, in this art...
4 則留言:
我試了一下,看這錯誤訊息應該不是Multiple Inclusion的問題。
我試著將A.hpp改成下面這樣子,就可以了,B.hpp這樣的方法去改也行。
=============================
#ifndef A_HPP_
#define A_HPP_
#include "B.hpp"
class A
{
public:
//B* bpt;
A();
virtual ~A();
private:
class B* bpt;
};
#endif /*A_HPP_*/
=============================
至於為什麼這樣子...compiler為什麼可以接受class B這宣告,而看不懂B這宣告,我也不太清楚...可能要請高手來看吧XD
因為編譯器在處理 A.h,
在處理 #include B.h 時,發現有 class A 尚未宣告,
而 A.h 並未處理完畢,
所以編譯器尚未知道 class A 的存在。
so...
class A 等 class B 定義完
class B 等 class A ,
像是 OS 裡的 deadlock一般,
故得在 A.h 先行定義 class B
在 B.h 先行定義 class A 就可以解決這個問題了。
這個是cyclic dependency(或cross dependency),打破循環引用即可。#include不過是文字代換指令,把#include那行代換成檔案內容,你可以自己試著代換看看應該就可以理解會什麼會有compile error了
在 C 中若使用到外部 func 可用 extern 告之.
例:
uart.h
----------
#ifndef _UART_H
#define _UART_H
extern unsigned char TXState;
extern void InitUart(void);
#endif //_UART_H
uart.c
----------
unsigned char TXState;
void InitUart(void)
{
...;
}
main.c
----------
#include "uart.h"
main()
{
TXState = 123;
InitUart();
}
但不知 C++ 可否有此關鍵字
張貼留言