代码之家  ›  专栏  ›  技术社区  ›  Rich khmarbaise

头文件中类的私有成员出现链接器错误

  •  1
  • Rich khmarbaise  · 技术社区  · 17 年前

    我正试图在VisualStudio2008中构建一个项目。我收到了一堆链接器错误,真的很困扰我。我的应用程序是使用本地ANSI C++的Win32控制台应用程序。

    它们都是相同模式的链接器错误。 链接器错误与我在自己的头文件中定义的类的每个私有静态数据成员有关。

    例子: 我指的是文件Delays.cpp中SingleDelay成员类的函数定义中的SingleDelay成员。

    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)延迟。obj testall

    延迟中单延迟的定义。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 回复  |  直到 11 年前
        1
  •  6
  •   greyfade    17 年前

    它们都是相同模式的链接器错误。链接器错误与我在自己的头文件中定义的类的每个私有静态数据成员有关。

    全部的 必须 .

    错误38错误LNK2001:未解析的外部符号“private:static double SingleDelay::dry”(?dry@SingleDelay@@0NA)延迟。obj testall

    链接器告诉您该变量没有定义的存储。这条线 必须 恰好出现在一个.cpp文件中:

    double SingleDelay::dry = 0.0;
    
        2
  •  2
  •   Gilad Naor    17 年前
    1. 可能您还没有添加库并将所用库的路径包含到项目定义中?
    2. C++错误总是很有趣的。或者不是。在任何情况下,您是否在任何地方初始化静态变量?您需要在某个地方的.cpp文件中执行此操作。记住要小心使用静态变量。它们实际上是伪装的全局变量,并且可能使将来的更改(如多线程)更加困难。
        3
  •  0
  •   Roman    15 年前

    可能错误存在于静态字段的可见性范围中,因为它们是私有的。 尝试编写在类定义中使用privete静态字段的代码,而不是在类之外。

    class SingleDelay{
     ...
    int tick(void *output, void *input, int nbufferFrames)
    { //.. code here
    x = dry * castInput + wet * castInput;
    }
     ...
    }
    
        4
  •  0
  •   Matt user129975    11 年前

    推荐文章