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“
答案 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;
由于缺少变量定义,您得到的是链接器错误。