2010-03-16 21 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