C ++类&朋友视觉工作室链接错误

时间:2015-12-30 06:55:47

标签: c++ visual-studio-2012 friend

 #include <iostream>

    using namespace std;

    class A
    { 
        static int x; 
        int y; 

     private: 
        friend void f(A &a); 

     public: 
     A() 
     { 
          x=y=5; 
     } 

     A(int xx,int yy) 
     { 
        x=xx; 
        y=yy; 
     } 

     //static void getVals(int &xx, int &yy); 
     void getVals(int *xx, int *yy) 
     { 
        *xx=x; 
        *yy=y; 
     } 

     void f(A &a) 
     { 
        int x,y; 
        a.getVals(&x,&y); 
        cout << a.x << "; " <<a.y << endl; 
      } 
    }; 

    int main() 
    { 
        A a1; 
        A a2(3,8); 

        f(a1); 
        f(a2); 

        return 0;
    } 

我在visual studio中遇到了2个链接错误:

  

错误1错误LNK2019:未解析的外部符号“void __cdecl   函数_main

中引用的f(A类&amp;)“(?f @@ YAXAAVA @@@ Z)      

错误2错误LNK2001:未解析的外部符号“private:static int   A :: x“(?x @ A @@ 0HA)

请帮助解决这些错误

3 个答案:

答案 0 :(得分:1)

静态成员变量只存在一次,并在类的对象之间共享。由于静态成员变量不是单个对象的一部分,因此必须显式定义静态成员。通常,显式定义放在类的源文件(cpp)中:

头文件:

class A
{ 
  static int x;
};

源文件:

int A::x = 0; // <- explicitly definition and initialization

答案 1 :(得分:0)

您需要在类声明后添加int A::x;。 您可以看到以下链接:http://www.learncpp.com/cpp-tutorial/811-static-member-variables/

答案 2 :(得分:0)

第一个错误:

您声明friend void f(A &a);,表示f是需要访问A成员的非成员函数。

但是,您仍然在类中定义f,使其成为成员函数。要解决此链接器错误,您应该将函数f移到类外。