藏經閣

一切有為法,如夢幻泡影,如露亦如電,應作如是觀。

#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裡

如何在Blogger新增隨機文章

Blogger Hack - How to add a Random Post Gadget in Blogger)

 


4 意見

  1. Falldog  

    我試了一下,看這錯誤訊息應該不是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

  2. easy  

    因為編譯器在處理 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 就可以解決這個問題了。

  3. The Coder  

    這個是cyclic dependency(或cross dependency),打破循環引用即可。#include不過是文字代換指令,把#include那行代換成檔案內容,你可以自己試著代換看看應該就可以理解會什麼會有compile error了

  4. ak  

    在 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++ 可否有此關鍵字

張貼留言