Ошибки компоновщика с закрытыми членами класса в заголовочном файле - PullRequest
1 голос
/ 01 марта 2009

Я пытаюсь построить проект в 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 ]

6 голосов
/ 01 марта 2009

Все они являются ошибками компоновщика одного и того же шаблона. Ошибки компоновщика связаны с каждым отдельным членом статических данных классов, которые я определил в своих собственных заголовочных файлах.

Все члены статических данных должны иметь определение в файле .cpp где-то .

Ошибка 38, ошибка LNK2001: неразрешенный внешний символ "private: static double SingleDelay :: dry" (? Dry @ SingleDelay @@ 0NA) Delays.obj testall

Компоновщик сообщает, что для этой переменной не определено хранилище. Эта строка должна появиться где-то ровно в одном файле .cpp:

double SingleDelay::dry = 0.0;
2 голосов
/ 01 марта 2009
  1. Может быть, вы не добавили библиотеку и не включили пути к используемой вами библиотеке в определения проекта?
  2. Ошибка C ++ всегда интересно посмотреть. Или нет. В любом случае, вы где-нибудь инициализируете свои статические переменные? Вам нужно сделать это в файле .cpp где-нибудь. И не забывайте использовать статические переменные с осторожностью. На самом деле они являются скрытыми глобальными переменными и могут усложнить будущие изменения, например многопоточность.
0 голосов
/ 30 октября 2010

Возможно, ошибка заключается в области видимости ваших статических полей, потому что они являются закрытыми. Попробуйте написать код, который использует ваше статическое поле в определении класса, а не за пределами вашего класса. Напишите этот метод только в вашем определении класса:

class SingleDelay{
 ...
int tick(void *output, void *input, int nbufferFrames)
{ //.. code here
x = dry * castInput + wet * castInput;
}
 ...
}
0 голосов
/ 01 марта 2009

Вам нужно добавить файлы .cpp и .h в файл .vcproj.

...