jjzjj

C++友元类

全部标签

c++ - 为什么我不能从不同 namespace 中的友元类更改类的私有(private)成员?

我发现从好友类访问类的私有(private)成员时遇到问题。持有我要更改的私有(private)成员的类和进行更改的类在不同的命名空间中。friend类是在保存数据的类之后定义的,所以我尝试在命名空间外转发声明friend类。g++说我不能修改成员,因为它是私有(private)的,visualstudio好像觉得没问题。我是不是在做一些奇怪的非标准事情?为什么我不能更改成员?这是一个代表我的问题的简化片段:structS;namespaceN{classA{intm;public:A():m(5){};friendstructS;};}usingnamespaceN;structS{

c++ - 我们可以声明一个没有参数的友元函数吗?

这可能吗?classsample{private:intx;public:friendvoidfun();};friend没有参数的函数!我认为不可能因为友元函数不是类的“成员”所以我们不能用类对象调用喜欢:samples;s.fun(); 最佳答案 是的,你可以:voidfun(){samples;s.x++;//OK,fun()isafriendofsample}或sampleglobalSample;//yikes,aglobalvariablevoidfun(){inti=globalSample.x;//OK,fun()i

c++ - 模板友元

我正在尝试访问具有不同模板参数的模板类的protected变量。带有模板参数的友元声明给出以下错误:不允许使用多个模板参数列表我的代码是templateclassMyClass{//multipletemplateparameterlistsarenotallowedtemplatefriendclassMyClass//syntaxerror:templateclassMyClasspublic:templateACopyConstructor(MyClass&myclass):SomeVariable(myclass.SomeVariable){}protected:O_SomeV

c++ - 类(class)友元——一个谜

我是初学者级别的面向对象编程爱好者。我遇到了以下难题:classA{};classB{protected:friendclassA;};classC{public:friendclassB;};引用上面的示例代码,假设上面的类都有数据成员,那么在A的成员声明中可以使用C的哪些成员名称?仅限私有(private)成员(member)仅限protected成员C的所有数据成员仅限公共(public)成员(member)不是C的数据成员*我的选择是答案4,因为友元是不可传递的。因此,A是B的friend,但A不是C的friend(即使B是C的friend)。这是正确的想法吗?另外,我的问题是

c++ - 将 C++ 静态成员函数声明为其所在类的友元(语法)

将静态成员函数声明为其所在类的友元的语法是什么。classMyClass{private:staticvoidCallback(void*thisptr);//DeclarestaticmemberfriendstaticvoidCallback(void*thisptr);//Defineasfriendofitself}我可以把它折叠成这个单衬里吗?classMyClass{private:friendstaticvoidCallback(void*thisptr);//DeclareANDDefineasfriend}还有另一种方法可以将它们全部折叠成一行吗?回答请不要投反对票,

c++ - 同一模板类中的友元

考虑以下几点:templateclassA{public:A():i(N){}templatevoidfoo(Aother){i=other.i;//a1;Aa2;a1.foo(a2);return0;}有没有办法让'other.i'可见而不将成员i和foo移动到一个公共(public)基类或做一些事情为添加A类好友而疯狂?就是有没有办法让同一个模板类的模板成为friend? 最佳答案 C++03没有为此提供机制,但C++11提供了。templatefriendclassA;应该friend所有A的实例化。

c++ - 来自模板类的友元函数

我有这样一个类:#include"Blarg.h"//...classFoo:publicBar{//...staticdoublem_value;//...};还有一个是这样的:templateclassBlarg:publicBar{//...voidSetValue(double_val){Foo::m_value=_val;}//...};由于Foo的m_value是私有(private)的(我想保持这种状态),我想我应该声明SetValue充当Foo类的友元,以便它可以在需要时访问静态成员。我已经尝试在Foo的公共(public)区域中按照这些行进行声明:templatefr

c++ - 运算符重载(友元函数和成员函数)

使用friend关键字重载运算符和作为类内的成员函数有什么区别?此外,任何一元运算符重载(即作为友元函数与作为成员函数)有什么区别? 最佳答案 Jacob是正确的……在类中声明的friend函数可以访问该类,但它根本不在类中,其他所有人都可以访问它。对于不是类成员的运算符重载(也称为自由函数,它可能是友元,也可能不是),参数与操作数相同。对于属于某个类的成员,第一个操作数是“隐式参数”,它变成了this。隐式参数在几个方面不同于自由函数的第一个参数:它的类型是类引用,而自由函数可以为其第一个参数声明任何类型。不参与隐式类型转换。(它

c++ - 模板友元

我正在尝试访问具有不同模板参数的模板类的protected变量。带有模板参数的友元声明给出以下错误:不允许使用多个模板参数列表我的代码是templateclassMyClass{//multipletemplateparameterlistsarenotallowedtemplatefriendclassMyClass//syntaxerror:templateclassMyClasspublic:templateACopyConstructor(MyClass&myclass):SomeVariable(myclass.SomeVariable){}protected:O_SomeV

被类函数隐藏的 C++ 友元函数?

最小的例子:classA{friendvoidswap(A&first,A&second){}voidswap(A&other){}voidcall_swap(A&other){swap(*this,other);}};intmain(){return0;}g++4.7说:friend.cpp:Inmemberfunction‘voidA::call_swap(A&)’:friend.cpp:7:20:error:nomatchingfunctionforcallto‘A::swap(A&,A&)’friend.cpp:7:20:note:candidateis:friend.cpp: