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' 告诉编译器不要创建立即代码,而是在使用点创建代码。
在我的一个 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' 告诉编译器不要创建立即代码,而是在使用点创建代码。