【问题标题】:c++ member function access private static variable? [duplicate]c ++成员函数访问私有静态变量? [复制]
【发布时间】:2012-03-23 04:06:43
【问题描述】:

可能重复:
What does it mean to have an undefined reference to a static member?

如果我在类声明之外实现函数,我不知道为什么会出现错误“未定义对 `TT::i' 的引用”? 这是代码..

class TT{
private:
    static int i;
public:
    void t();
};

void TT::t(){
    i=0;
}

【问题讨论】:

    标签: c++ static-members


    【解决方案1】:

    这与你定义函数的位置无关,你没有定义静态成员变量,你只是声明了它。您需要将其定义放在类之外,例如

    int TT::i;
    

    【讨论】:

      【解决方案2】:

      对 `TT::i' 的未定义引用

      是因为你没有在类外定义静态数据成员。所有静态数据成员都必须在使用它们之前在类外部定义。

      class TT
      {
      private:
          static int i;
      public:
          void t();
      };
      
      void TT::t()
      {
          i=0;
      }
      int TT::i=0; // define it outside the class. and if possible initialize 
      

      【讨论】:

        【解决方案3】:

        静态变量保存在与类的任何实例不同的内存部分。这是因为它们不是任何类的实例的一部分。

        下面的代码可以编译,因为函数 t 从未被调用。

        class TT
        {
        private:
            static int i;
        public:
            void t()
            {
                i=0;
        
        
            }
        };
        
        int main(int argc, char *argv[])
        {
            qWarning() << "hi";
            TT * t = new TT();
            //t->t();
            return 0;
        }
        

        但是,这段代码不符合要求,因为 t 被调用了

        class TT
        {
        private:
            static int i;
        public:
            void t()
            {
                i=0;
            }
        };
        
        int main(int argc, char *argv[])
        {
            qWarning() << "hi";
            TT * t = new TT();
            t->t();
            return 0;
        }
        

        您可以拥有未在 C++(以及 C 中)中使用的未定义引用。出于某种原因,我不确定,编译器似乎认为这段代码引用了 i,而上面的代码在调用之前没有引用它(关于为什么的任何想法)?

        class TT
        {
        private:
            static int i;
        public:
            void t();
        };
        
        //int TT::i = 0;
        
        void TT::t(){
            i=0;
        }
        

        功能示例,定义了静态:

        class TT
        {
        private:
            static int i;
        public:
            void t();
        };
        
        int TT::i = 0;
        
        void TT::t(){
            i=0;
        }
        

        【讨论】:

        • 他得到的“未定义引用”错误是链接器错误而不是编译器错误。
        • 绝对正确。我有将“编译输出”控制台中出现的任何内容称为编译器错误的坏习惯。
        • 这是一个更完整的答案! :D
        猜你喜欢
        • 2020-01-27
        • 2014-06-13
        • 1970-01-01
        • 2018-05-15
        • 1970-01-01
        • 2014-12-05
        • 1970-01-01
        • 2020-03-22
        • 2018-01-07
        相关资源
        最近更新 更多