类外的C ++成员函数定义重复的符号

时间:2018-03-04 21:30:20

标签: c++ member-functions duplicate-symbol

在我的一个类头文件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)文件?

2 个答案:

答案 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'告诉编译器不要创建即时代码,而是在使用点创建代码。