草庐IT

c++ - C++ 中未使用的友元类

有没有办法检测(例如编译器警告)类是否被声明为friend但不访问私有(private)成员,即。什么时候友元没用了? 最佳答案 我不知道如何使用编译器警告来检测这一点,但另一种方法是转到您的类定义文件并搜索并用替换friendclass/*friend*/class看看它是否仍然可以编译。当然,对于大型项目来说,这可能会变得相当乏味。 关于c++-C++中未使用的友元类,我们在StackOverflow上找到一个类似的问题: https://stackove

c++ - 如何让一个类只能访问另一个类的某些私有(private)成员?

假设我们有两个类:classBase{private:intx;public:voidf();};classFoo{//somevariablesandmethods};现在每个人都可以调用Base::f(),但我只希望Foo能够调用。为了达到这个效果,我们可以将Base::f()设为私有(private),并将Foo声明为友元:classBase{private:intx;voidf();friendFoo;};这种方法的问题在于Foo可以访问Base::f()和Base::x(并且甚至是Base的任何其他私有(private)成员)。但我希望Foo只能访问Base::f()。有没有

c++ - 无法在 pthread_create 函数中将 '*void(MyClass::*)(void*) 转换为 void*(*)(void*)

我正在尝试使用“CameraManager”类创建一个新线程,但出现以下错误:cannotconvert'*void(CameraManager::*)(void*)tovoid*(*)(void*)inpthread_createfunction我在cameramanager.h文件中定义:public:void*dequeueLoop(void*ptr);在cameramanager.cpp中voidCameraManager::startDequeuing(){dequeuing=true;dequeueThreadId=pthread_create(&dequeueThread

c++ - 为什么以及如何重载 operator<< 用于打印

我写了一个实现栈的程序。我有一个显示功能。一开始我是这样写display函数的:templatevoidMystack::display(){for(inti=0;i然后开发人员建议我写一个显示功能更通用。所以我把显示函数写成:templatevoidMystack::display(std::ostream&os)const{for(inti=0;i根据我的理解,编写上述函数的好处是现在我有一个通用的显示函数,我也可以使用它来显示数据到控制台或文件。问题一:我的理解是否正确?现在另一个建议是编写如下函数:templatefriendstd::ostream&operatorconst

c++ - friend 功能和 friend 类有什么区别?

友元函数和友元类有什么区别?应该在哪里使用friend关键字? 最佳答案 简而言之,一个是类,一个是函数。对于函数,只有一个函数可以访问私有(private)成员。对于一个类,整个类及其所有函数都可以访问友好类的私有(private)成员。friend关键字用于授予对私有(private)数据成员的访问权限。有时您可能需要帮助类或免费类来访问不同类的私有(private)成员。对于函数,一个常见的例子是运算符重载。也许您想重载+运算符。您可以在类外部声明一个operator+函数(这样它就可以在没有对象的情况下被调用)并且它需要访问

c++ - 为嵌套类模板重载运算符<<

我有以下设置:templatestructFoo{structBar{Bar(constT&t):otherT_(t){}TotherT_;};Foo(constT&t):myT_(t){}TmyT_;};现在,我想创建Foo::Bar的实例流式传输到std::cout和friend。我试过这个:templatestd::ostream&operator::Bar&bar){os";returnos;}但是下面的代码不能编译:Foofoo(5);Foo::Barbar(7);std::cout我猜编译器无法推断出类型T或者其他的东西。有没有办法使嵌套类的此类实例在operator下表现

c++ - 好友声明是真实的声明吗?

C++Primer说:Itisimportanttounderstandthatafrienddeclarationaffectsaccessbutisnotadeclarationinanordinarysense.所以友元声明应该只提供对友元类/函数的访问权限,它不是真正的声明。但是,我试过这个程序,它编译成功并在GCC5.2.0中输出2,有什么问题吗?#includeclassTmp{public:Tmp(inta):a_(a){};private:inta_;friendvoidp(Tmpa){std::cout 最佳答案

java - Java 是否提供 'friend' 访问修饰符?

我想知道Java是否提供“friend”(如在C++中)访问修饰符?有人说我们可以将“friend”作为Java中的默认修饰符。是真的吗? 最佳答案 Java中的默认访问修饰符允许同一包中的任何代码访问成员。 关于java-Java是否提供'friend'访问修饰符?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/5770852/

c++ - 在 C++ 中,您几乎一直都在做什么?

当我用C++组合一个类时,我几乎总是会做一些事情。1)虚拟析构函数2)复制构造函数和赋值运算符(我要么根据名为Copy()的私有(private)函数实现它们,要么将它们声明为私有(private)的,从而明确禁止编译器自动生成它们)。您发现什么东西几乎总是有用的? 最佳答案 奇怪的是,这里的大部分建议都是我特别不做的事情。我不会将dtors虚拟化,除非我专门将其设计为可继承。它增加了很多开销并阻止了自动内联,这很糟糕,因为大多数dtor无论如何都是空的(并且很少有类从继承中受益)除非默认值不起作用,否则我不会制作复制构造函数/赋值

c++ - friend 困惑

$11.4/5-“[...]类中定义的友元函数在定义它的类的(词法)范围内[...]”这句话是什么意思?structA{typedefintMYINT;voidf2(){f();}//Error,'f'isundefinedfriendvoidf(){MYINTmi=0;}//Whydoesthiswork,shouldn'itbeA::MYINT?voidf1(){f();}//Error,'f'isundefined};intmain(){}这里令人困惑的是从“A::f1”调用“f”是完全可以理解的。但是,为什么当friend处于友好类的“词汇”范围内时,从“A::f2”调用“f”