草庐IT

Friend-ing

全部标签

c++ - 两个类(class)可以成为 friend 吗?

我还没有研究出具体的案例。但是我即将着手编写一些我认为最终会需要它的代码;所以我想知道是否:两个类可以互相成为friend;以便他们可以自由访问私有(private)和protected另一方成员(我相信答案是肯定的,当然我可以简单地尝试一下!)。任何详细的引用资料或其他带有答案的问题链接也很受欢迎。我知道前向声明并包含保护编译器前置指令及其使用。我的问题与语义更相关C++语言在这种可能性方面可以提供什么相互友元以及如何正确使用它。这是普遍推荐的吗?人们是否定期采用这种设计?在什么情况下这是推荐的设计(最好有一些示例)。 最佳答案

c++ - 一个类自动成为它自己的 friend

为什么会这样?#includeclassClassA{public:ClassA(intid):my_id(id){};ClassA*makeNewA(intid){ClassA*a=newClassA(id);printf("ClassAmadewithid%d\n",a->getId());returna;};private:intgetId(){returnmy_id;};private:intmy_id;};intmain(){ClassAa(1);ClassA*b=a.makeNewA(2);return0;}不管它是不是一个好主意,它为什么有效?公共(public)函数Cl

C++11/14/17,GCC 7 与 GCC 8 : Name lookup for friend class templates

我想弄清楚以下代码在GCC7中是否有效,但在GCC8.1中无效。代码的作用是:定义(并转发声明)类模板MyGoodFriend(在全局命名空间中)在inner命名空间中定义一个类模板Befriended使MyGoodFriend的所有特化成为Befriended的friend有问题的部分是templatefriendclassMyGoodFriend;我明白问题是什么了。GCC8.1要求我在friend声明中使用完全限定名称::MyGoodFriend-然而,GCC7对MyGoodFriend很满意。这是代码:templateclassMyGoodFriend;namespaceinn

c++ - 有效地 const_cast-ing 常量引用参数

我有一个成员函数,它接受另一个对象的常量引用参数。我想const_cast这个参数以便在成员函数中轻松使用它。为此,以下哪个代码更好?:voidAClass::AMember(constBClass&_BObject){//FORM#1-Castasanobject:BClassBObject=const_cast(_BObject);//...}voidAClass::AMember(constBClass&_BObject){//FORM#2-Castasareference:BClass&BObject=const_cast(_BObject);//...}你能比较一下这两种形式

C++将 friend 添加到模板类以进行类型转换

我目前正在阅读“EffectiveC++”,有一章包含与此类似的代码:templateclassNum{public:Num(intn){...}};templateNumoperator*(constNum&lhs,constNum&rhs){...}Numn=5*Num(10);书上说这行不通(实际上行不通),因为您不能指望编译器使用隐式类型转换来专门化模板。作为解决方案,建议使用“friend”语法在类中定义函数。//ItworkstemplateclassNum{public:Num(intn){...}friendNumoperator*(constNum&lhs,const

c++ - Friend 类、继承和 typedef——哪种行为是正确的?

我偶然发现了一个错误,该错误仅在GCC6.2.0上出现,但在Clang3.9.0上没有出现(均在-std=c++14模式下)。我不确定哪种行为是正确的(以及我是否应该提交错误)。代码如下:templateclassfoo_t{};classbar_t{public:usingfoo_t=int;};classbaz_t:publicbar_t{private:templatefriendclassfoo_t;};在GCC上,这会产生以下错误:test.cpp:17:15:error:usingtypedef-name‘usingfoo_t=int’after‘class’friendc

C++ - ostream、 friend 和命名空间

在我将我的对象移动到命名空间之前,一切都很好。现在编译器声称我的Color属性是私有(private)的。我认为friend的全部意义在于与类的friend分享封装的信息。颜色.hfriendostream&operator颜色.cpp:ostream&operator错误:Color.h||Infunction'std::ostream&operator那到底是怎么回事呢?我使用Code::Blocks作为我的IDE。当我在“颜色”参数上使用点运算符时,它甚至不会显示任何属性或方法。这显然是出现问题的迹象……某处。我已经去掉了友元运算符的重载,它编译得很好。其他地方没有错误。给了什么

c++ - 作为 friend 的模板参数

在C++03中,以下是非法的,尽管一些编译器支持它。templateclassX{friendT;};这在C++11中合法化了吗?(不好意思,自己没时间看草稿,希望有人知道) 最佳答案 来自N3291的§11.3,3部分:templateclassR{friendT;};Rrc;//classCisafriendofRRRi;//OK:"friendint;"isignored所以它在C++11中是合法的。 关于c++-作为friend的模板参数,我们在StackOverflow上找到一

C++ 范围-v3 库 : 'take' -ing first 3 perfect numbers works and halts; 'take' -ing first 4 doesn't stop after 4

据我了解,range-v3库的View操作(目前需要C++17,但要成为C++20中STL的正式部分)提供了可链接的类STL算法,这些算法是延迟计算的。作为实验,我创建了以下代码来评估前4个完全数:#include#includeusingnamespacestd;intmain(intargc,char*argv[]){autoperfects=ranges::view::ints(1)|ranges::view::filter([](intx){intpsum=0;for(inty=1;y代码以可能无限范围的数字开始(ranges::view::ints(1)),但是因为View算

C++ friend 构造函数

我有两个类:Point,它只存在于SpaceclassPoint{private:Point(constSpace&space,intx=0,inty=0,intz=0);intx,y,z;constSpace&m_space;};构造函数是有意私有(private)的,我不想直接调用它。我想以这种方式创建积分SpacemySpace;PointmyPoint=mySpace.Point(5,7,3);有什么办法吗?谢谢。 最佳答案 是的,将Space::Point()声明为友元方法。该方法将获得对Point的私有(private)