MWE :(最小[不]工作示例)
class base
{
protected:
int b;
};
class derived : public base
{
friend void incr();
};
void incr()
{
base::b ++;
}
int main()
{
return 0;
}
创建此代码是为了演示我在一个更大的项目中遇到的编译器错误。
我有一个带有一些数据成员的基类。然后,我创建一个派生类,以向基类添加其他函数。其中一些函数是友元函数,我认为这些函数可以让我访问基类的受保护成员,但显然不是。我实现了这些函数作为朋友,因为他们在内存块之间复制操作,并且在语法上使它们在外部实现更有意义。
有没有办法解决编译器错误(见下文)而不将这些函数更改为派生类的成员,或者通过添加其他成员函数来获取/设置数据。 (由于增加了复杂性,我真的不想这样做。)
g ++产生的错误:
./src/main_test.cpp: In function ‘void incr()’:
./src/main_test.cpp:7:9: error: ‘int base::b’ is protected
int b;
^
./src/main_test.cpp:17:11: error: within this context
base::b ++;
^
./src/main_test.cpp:7:9: error: invalid use of non-static data member ‘base::b’
int b;
^
./src/main_test.cpp:17:11: error: from this location
base::b ++;
我对成员和非成员函数感到困惑。非成员函数需要一个对象来操作,因为没有这个指针。
class base
{
protected:
int b;
};
class derived : public base
{
friend void incr(derived &d);
};
void incr(derived &d)
{
d.b ++;
}
答案 0 :(得分:1)
好吧,如果你可以控制基数,你可以在基础上添加朋友(从语义上讲,这是你真正想要做的事情。)
以下代码段编译。
派生类保留其基础的友谊访问权限,而不必渗透到其自己的属性。 incr
无法访问derived
个私人会员。
class base
{
protected:
int b;
friend void incr();
};
class derived : public base
{
};
derived obj;
void incr()
{
obj.b ++;
}
int main()
{
return 0;
}
这也有效:
class base
{
protected:
int b;
};
class derived : public base
{
friend void incr();
protected:
int c;
};
derived obj;
void incr()
{
obj.b ++;
obj.c ++;
}
int main()
{
return 0;
}