class 之外的 C++ 成员函数定义 |重复符号

C++ member function definition outside the class | duplicate symbols

在我的一个 classes 头文件 Lfo.h 中,我有一个 class 定义,我将成员函数定义放在 class 之外(它可能最好有一个单独的 .cpp 文件,但它应该可以放在这里?):

// Lfo.h
class CLfo
{
public:
    static int create (CLfo*& pCLfo);
};

int CLfo::create(CLfo *&pCLfo)
{
    pCLfo = new CLfo;
    return 0;
}

然后我有另一个 class 叫 CVibrato:

// Vibrato.h
class CVibrato
{
public:
    static int create (CVibrato*& pCVibrato);
private:
    CVibrato();
};

和.cpp文件(在cpp文件中,我包含了Lfo.h因为后面抖音class会有一个lfo成员但是我现在还没有实现):

// Vibrato.cpp
#include "Lfo.h"
#include "Vibrato.h"
int CVibrato::create(CVibrato *&pCVibrato)
{
    pCVibrato = new CVibrato();
    return 0;

}

CVibrato::CVibrato()
{
}

然后我想在main()

中创建一个抖音实例class
#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里面,我把成员函数的定义放在了class外面,如果放在里面,程序就可以正常运行了。但我无法理解。在 C++ 中,我们不允许这样做吗?顺便说一下,如果我的一个 class(在我的例子中是颤音)将有另一个 class(在本例中是 lfo)的 class 成员,我是否应该包含头文件.h (vibrato.h) 文件或 .cpp (vibrato.cpp) 文件中的成员 class?

您不能将 class 方法定义直接放在头文件中,除非您明确将其标记为内联。像下面这样:

// Lfo.h
class CLfo
{
public:
    inline static int create (CLfo*& pCLfo);
};

int CLfo::create(CLfo *&pCLfo)
{
    pCLfo = new CLfo;
    return 0;
}

或者,

// Lfo.h
class CLfo
{
public:
    static int create (CLfo*& pCLfo);
};

inline int CLfo::create(CLfo *&pCLfo)
{
    pCLfo = new CLfo;
    return 0;
}

类 是声明。声明不会生成任何代码。即使您在 class 中有一个成员函数,编译器也会将其视为 inline。函数体可以放在 header 中,但应始终声明为 inline。编译器可能不会真正内联它,但它会把它当作代码创建的单个实例。

任何时候你:

void function( ) { }

已为该函数创建代码。如果多次包含 header,编译器将被告知多次创建代码。但是所有的函数都必须有唯一的名字!所以你得到了重复的错误。这就是代码生成行属于 .cpp 文件的原因。

'inline' 告诉编译器不要创建立即代码,而是在使用点创建代码。