从友元函数访问静态变量

时间:2011-02-02 19:11:47

标签: c++ function static friend var

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 基地:: NUM“

     

视觉工作室出错 - >错误LNK2001:   未解决的外部符号“私人:   static int Base :: num“

5 个答案:

答案 0 :(得分:4)

您的免费功能称为setvals,但Base的友情功能称为setnum ...

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

把:

int Base::num;

在源文件中。

答案 1 :(得分:2)

您只声明了静态变量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;
}

在您的基础班:

friend void setvals(); 

因为num是静态的。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

不同的朋友:

friend void setnum(Base obj); 
         //    ^^^  Not the same as vals!
       void setvals(Base obj)

答案 4 :(得分:0)

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

int Base::num;

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