3
class Base
{
private:
    static int num; 
public:
    friend void setnum(Base obj); 
};

void setnum(Base obj)
{
    obj.num=4;  /* Error */
}

友元函数应该可以访问类的所有私有数据。我在这里想念什么?我似乎无法从朋友函数访问静态变量。

来自键盘的错误--> 在函数 setnum(Base)': undefined reference to Base::num'

来自 Visual Studio 的错误--> 错误 LNK2001:无法解析的外部符号“private:static int Base::num”

4

5 回答 5

4

你的 free 函数被调用setvals了,但是Base's 的朋友函数被调用setnum了......

此外,您必须实际定义静态变量,而不仅仅是声明它。

放:

int Base::num;

在源文件中。

于 2011-02-02T19:17:14.920 回答
4

您只声明了静态变量num。您必须定义它:

class Base
{
private:
    static int num; 
public:
    friend void setvals(Base obj); 
};

// This must be in a .cpp
int Base::num;

void setvals(Base obj)
{
    obj.num=4;
}

此代码有效。

编辑:

实际上,您可以setvals()按如下方式实现该功能:

void setvals()
{
    Base::num=4;
}

在您的 Base 课程中:

friend void setvals(); 

因为num是静态的。

于 2011-02-02T19:19:21.733 回答
0

不一样的朋友:

friend void setnum(Base obj); 
         //    ^^^  Not the same as vals!
       void setvals(Base obj)
于 2011-02-02T19:19:04.357 回答
0

在 C++ 中,仅在 .h 中声明静态变量是不够的;您还必须在 .cpp 中明确定义它。您必须添加实现的 .cpp

int Base::num;

由于缺少变量定义,您得到的是链接器错误。

于 2011-02-02T19:20:09.977 回答
0

静态变量不属于类的任何特定实例。相反,您可以使用类名访问它们Base::num以提高可读性。此外,您的朋友函数定义的签名与您声明的签名不同。

于 2011-02-02T19:17:09.257 回答