繁体   English   中英

从友元函数访问静态变量

[英]Accessing static variable from a friend function

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' 的setnum(Base)': undefined reference to

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

您的自由函数称为setvals ,但Base的友元函数称为setnum ...

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

放:

int Base::num;

在源文件中。

您只声明了静态变量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是静态的。

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

不一样的朋友:

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

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

int Base::num;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM