2012-06-01 77 views
0

好吧,所以我遇到了Visual Studio C++(C++/CLI)中的Forward Declarations問題。 的代碼如下:Visual C++(C++/CLI)使用派生類的前向聲明?

#include "B.h" 

#ifdef B_H 
#pragma once 

public ref class A : public base_class //base_class is public, memory managed 
{ 
    B^ b; 
} 

#endif 

了Bh

#define B_H 

#pragma once 

ref class A; 

ref class B 
{ 
    A^ a; 
} 

#include "A.h" 

的的#ifdef /#編譯後衛應該保持從被讀取兩次保持* .h和強迫BH先被讀取,然後從編譯器輸出我很確定他們是。 (我甚至不知道#pragma一次和#include的位置需要#ifdef/#define)

但是,編譯器抱怨path/a.h:錯誤C2011:'class'類型重定義。 請參閱文件路徑/ B.h

我應該對A的前向聲明做些什麼,因爲它是實際類定義中的派生類,還是我在咆哮錯誤的樹?需要

回答

3

兩個變化:

  1. 類定義的大括號後面添加分號。
  2. 在A.h中,將#pragma once作爲文件中的第一行。在#ifdef區塊內部發生這種情況已經搞砸了。

另外,還要注意一個簡單的方法來做到這一點。將不會有任何的頭文件包括其他的,並在這兩個文件中使用的前置聲明:

啊:

#pragma once 
ref class B; 
public ref class A : public base_class //base_class is public, memory managed 
{ 
    B^ b; 
}; 

了Bh

#pragma once 
ref class A; 
ref class B 
{ 
    A^ a; 
}; 
+0

通過在#ifdef之外移動一次#pragma如果Ah先被預處理,則未定義A。 另外,我需要使用.cpp文件中引用的方法,所以我需要#include .h文件中的某處,但使用第二種方法並在.h的作品底部添加#include! 謝謝! –

+0

爲了解決這個問題,我建議你從頭文件底部刪除#include,並簡單地從你的.cpp文件中包含A.h和B.h。 –

+0

是不是把#include放在.cpp文件中不好的做法? (不是說預處理完畢後,所有東西都沒有混合在一起) –