在我的一个类头文件Lfo.h
中,我有一个类定义,其中我将成员函数定义放在了类之外(最好有一个单独的.cpp文件,但它应该没问题这里):
// Lfo.h
class CLfo
{
public:
static int create (CLfo*& pCLfo);
};
int CLfo::create(CLfo *&pCLfo)
{
pCLfo = new CLfo;
return 0;
}
然后我有另一个名为CVibrato的课程:
// Vibrato.h
class CVibrato
{
public:
static int create (CVibrato*& pCVibrato);
private:
CVibrato();
};
和.cpp文件(在cpp文件中,我包含Lfo.h,因为稍后在vibrato类上会有一个lfo成员,但我现在还没有实现):
// Vibrato.cpp
#include "Lfo.h"
#include "Vibrato.h"
int CVibrato::create(CVibrato *&pCVibrato)
{
pCVibrato = new CVibrato();
return 0;
}
CVibrato::CVibrato()
{
}
然后我想在main()
中创建一个颤音类的实例#include "Vibrato.h"
#include "Lfo.h" // if comment this line out there will be no error, why is that?
int main()
{
CVibrato *vibrato = 0;
CVibrato::create(vibrato);
return 0;
}
但是我收到1 duplicate symbol for architecture x86_64
错误。什么是重复的?看来原因是在Lfo.h中,我把成员函数的定义放在了类之外,如果我把它放在里面,程序运行正常。但我无法理解。在c ++中,我们不允许这样做吗?顺便说一句,如果我的一个类(在我的情况下是颤音)将有另一个类的类成员(在本例中为lfo),我应该在.h(vibrato.h)文件中包含成员类的头文件或.cpp(vibrato.cpp)文件?
答案 0 :(得分:1)
您不能将类方法定义直接放在头文件中,除非您明确将其标记为内联。如下所示:
System.Web.HttpContext.Current.Application["Name"] = "Value";
或者,
// Lfo.h
class CLfo
{
public:
inline static int create (CLfo*& pCLfo);
};
int CLfo::create(CLfo *&pCLfo)
{
pCLfo = new CLfo;
return 0;
}
答案 1 :(得分:1)
类是声明。声明不生成任何代码。即使您在类中有成员函数,它也会被编译器视为inline
。函数体可以放在标题中,但应始终声明为inline
。编译器实际上可能没有内联它,但它会将其视为代码创建的单个实例。
任何时候你:
void function( ) { }
为该功能创建代码。如果多次包含标头,则会告诉编译器不止一次创建代码。但所有功能必须具有唯一的名称!所以你得到了重复的错误。这就是代码生成行属于.cpp
文件的原因。
'inline'告诉编译器不要创建即时代码,而是在使用点创建代码。