В одном из заголовочных файлов моих классов 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, потому что позже класс вибрато будет иметь член 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, определение функции-члена я выношу за пределы класса, если выношу внутрь, то программа работает корректно. Но я не могу понять. В С++ разве нам не разрешено это делать? Кстати, если один из моих классов (в моем случае вибрато) будет иметь член класса другого класса (в данном случае lfo), я должен включить заголовочный файл класса-члена в файл .h (vibrato.h). или файл .cpp (vibrato.cpp)?
int CLfo::create(CLfo *&pCLfo);
. Посмотри на это. Это прямо там, на виду. Таким образом, любая единица перевода, включающая этот заголовочный файл, будет определять этот член класса. Если его включает более одной единицы перевода, это ошибка повторяющегося символа во время компоновки. Каждый член класса, функция и т.д. al., должен быть определен ровно один раз. Ни больше ни меньше. Кажется довольно очевидным, что именно в этой проблеме вам не совсем понятно? - person Sam Varshavchik   schedule 05.03.2018