Ошибки компоновщика с закрытыми членами класса в файле заголовка
Я пытаюсь создать проект в Visual Studio 2008. Я получаю множество ошибок компоновщика, которые меня действительно беспокоят. Мое приложение представляет собой консольное приложение Win32, использующее только собственный ANSI C++.
Все они являются ошибками компоновщика одного и того же шаблона. Ошибки компоновщика связаны с каждым отдельным членом статических данных классов, которые я определил в моих собственных файлах заголовков.
Я предполагаю, что это, вероятно, простой факт о C++, о котором я еще не знаю?
Пример: я ссылаюсь на члены SingleDelay в определениях функций классов-членов SingleDelay в файле Delays.cpp. то есть:
SingleDelay::tick(void *output, void *input, int nbufferFrames)<br>{
//.. code here<br>
x = dry * castInput + wet * castInput;<br>
}
Ошибка 38 ошибка LNK2001: неразрешенный внешний символ "private: static double SingleDelay :: dry" (? Dry @ SingleDelay @@ 0NA) Delays.obj testall
Определение SingleDelay в Delays.h:
class SingleDelay{
private:
static double dry; //% of dry signal<br>
static double wet; //% of wet signal<br>
static unsigned int delay; //Delay in milliseconds<br>
static int delayCell; //Index in the delayBuffer of the delay to add<br>
static double *delayBuffer; //Delay buffer is 1 second long at sample rate SAMPLE_RATE<br>
static unsigned int bufferCell; //Pointer to the current delay buffer cell<br>
public:
//Tick function
static void tick(void *output, void *input,int nBufferFrames);
//Set and Get functions
static void setSingleDelay(double tDry, double tWet, unsigned int tDelay);
static void setSingleDelay(void);
static void setDry(double tDry);
static void setWet(double tWet);
static void setDelay(unsigned int tDelay);
static double getDry(){ return dry;}
static double getWet(){ return wet;}
static unsigned int getDelay(){ return delay;}
static void initializeDelayBuffer(){
destroyDelayBuffer();
delayBuffer = new double[bufferLength];
}
static void destroyDelayBuffer(){
delete[ ] delayBuffer;
}
};
Ответов (4)4
- Может быть, вы не добавили библиотеку и не включили пути к библиотеке, которую вы используете, в определения проекта?
- C++ error are always fun to look at. Or not. In any case, do you initialize your static variables anywhere? You need to do this in a .cpp file somewhere. And remember to use static variables with care. They are actually global variables in disguise, and can make future changes, such as multi-threading, more difficult.
Все они являются ошибками компоновщика одного и того же шаблона. Ошибки компоновщика связаны с каждым отдельным членом статических данных классов, которые я определил в моих собственных файлах заголовков.
Все статические элементы данных должны иметь определение где-нибудь в файле .cpp .
Ошибка 38 ошибка LNK2001: неразрешенный внешний символ "private: static double SingleDelay :: dry" (? Dry @ SingleDelay @@ 0NA) Delays.obj testall
Компоновщик сообщает вам, что для этой переменной нет определенного хранилища. Эта строка должна появиться где-то ровно в одном файле .cpp:
double SingleDelay::dry = 0.0;
Возможно, ошибка заключается в области видимости ваших статических полей, потому что они частные. Попробуйте написать код, который использует ваше статическое поле privete в определении класса, а не за пределами вашего класса. Напишите этот метод только в определении вашего класса:
class SingleDelay{
...
int tick(void *output, void *input, int nbufferFrames)
{ //.. code here
x = dry * castInput + wet * castInput;
}
...
}