2010-03-16 64 views
3

我剛剛從C#遷移到C++/CLR。首先,我很惱火,我必須兩次寫入所有類的聲明(到.h和.cpp中)。然後我發現,我可以將代碼放入h文件中 - 至少編譯它。好吧,我刪除了所有類的cpp,現在我意識到,當我編寫h文件時,VS不會給我任何Intellisense。頭文件中的Intellisense

我想我不應該把我的代碼放在hfiles中(該代碼肯定不會在其他項目中重用),但是我發現在兩個地方調整所有方法聲明是很糟糕的...另外,我必須來回切換看看我的方法是什麼修飾符等,它不像C#中的所有地方都很好(有它的優點和缺點)。

對不起,這是一個新手問題,但我只是想確保沒有任何可能爲hfiles啓用intellisense。或者至少去學習,我是完全錯誤的道路上......

謝謝,大衛

回答

0

由於每個類的代碼都被內聯到每個實現文件中,而且這只是比Intellisense更多的數據可靠地解析。由於超時而開始失敗。

我知道你說這很煩人,但是你必須把這個類放入兩次 - 這就是C++的工作原理。如果您希望它像C#一樣行事,請使用C#。無論如何,它對.NET平臺來說都是更好的語言。

+0

沒有可以完成將定義自動放入h-和cpp文件的工具/插件嗎? – David 2010-03-16 22:06:44

+0

@David:我們祝福! – quamrana 2010-03-16 22:20:59

+0

@David:即使VS2010出來了(它修復了這個特定的intellisense問題),它仍然不會很好,因爲您的結果可執行文件會很大,因爲代碼需要在每個使用類的.cpp文件中重新實現,如果它內聯就像你在標題中所描述的那樣。不要在這裏與語言對抗 - 這就是它的設計。如果你不喜歡這個,回到C#。 C++/CLI更重要的是能夠重用現有的C++代碼,而不是用於新的開發,以達到我(儘管有限)的理解。 – 2010-03-16 22:33:34

1

你.h文件應包含聲明。您的.cpp文件,定義。

下面是一個例子:

b.h

#ifndef B_H  
#define B_H 

    class B 
    { 
     public: 
     int foo(); 
     void Set(int x); 

     private 
     int data_; 
    }; 

#endif 

b.cpp

#include <stream> 
#include "b.h" 

int B::foo() 
{ 
    std::cout << "data value " << data_; 
    return data_; 
} 

void B::Set(int x) 
{ 
    data_ = x; 
} 

,您將使用B類對象的任何地方,你#包括B.H。如果你這樣做,智能感知應該可以工作

+0

Yup +1。這就是需要發生的事情。 – 2010-03-16 17:18:35

+0

'b.h'包含2個'#endif'。第一個,'#define'應該被刪除。 :-) – 2010-03-16 18:22:17

+0

@Thomas:改正了。 – quamrana 2010-03-16 22:21:21