草庐IT

private-messaging

全部标签

c++ - 声明构造函数私有(private)和 =delete 有什么区别?

例如,我想声明一个类,但我希望客户端不能使用复制构造函数(或复制赋值运算符)以下两种都不允许使用拷贝构造函数:1.classTrack{public:Track(){};~Track(){};private:Track(constTrack&){};};2.classTrack{public:Track(){};~Track(){};Track(constTrack&)=delete;};其中一种方式是否比另一种方式“更正确”或相等?有没有副作用?//Doesnotcompilewithboththeabovewaysintmain(){Trackl;Trackp(l);}

c++ - 为什么在接口(interface)中定义私有(private)成员/方法?

我一直对大多数OOP语言(或者更确切地说,C++)让你在接口(interface)中定义私有(private)方法/成员这一事实感到困惑(我所说的接口(interface)是指类声明-似乎我很困惑)。这不是展示了类的实现细节,违背了封装的思想吗?我错过了这个有充分的理由吗? 最佳答案 对于C++,这是一个实现问题。C++编译器必须能够通过只查看类声明而不是实现来生成使用类的代码。编译器需要的一件非常重要的事情是类实例的大小,因为除其他外,C++通过嵌入而不是通过存储对单独对象的引用来处理对象中的子对象。为了能够构建一个对象(例如st

c++ - 为什么 PRIVATE 成员函数不能成为另一个类的友元函数?

classx{voidxx(){}};classy{friendvoidx::xx();};这会导致类似的错误error:friendfunction'xx'isaprivatememberof'x'为什么我不能将私有(private)成员函数声明为另一个类的friend? 最佳答案 [class.friend]/9:Anamenominatedbyafrienddeclarationshallbeaccessibleinthescopeoftheclasscontainingthefrienddeclaration.原因很简单;p

c++ - 比较两个 google::protobuf::Message 对象的最简单方法是什么?

我想比较两个任意google::protobuf::Message对象。我假设对象是相等的它们的描述包含具有相同字段编号和对应字段类型的字段。它们的反射具有相同的字段集(以及相同数量的重复字段)和相等的对应字段值。我知道,我可以自己编写这样的比较函数,但可能已经有一些简单或预定义的解决方案?另外,我可能遗漏了一些关于此类对象不可比性的主要问题-我想知道是不是这样。 最佳答案 您可以使用google::protobuf::util::MessageDifferencer为了这。看看myanswerhere.

C++11 私有(private)默认构造函数

以下C++11代码在我的GCC4.8上成功编译:structNonStack{private:NonStack()=default;public:staticNonStack*Create(){returnnewNonStack;}};NonStacka;intmain(){}但是以下给出了编译错误:structNonStack{private:NonStack(){}};NonStacka;intmain(){}为什么第一个成功了?私有(private)默认构造函数不应该禁止通过NonStacka;创建对象吗? 最佳答案 这是gc

C++私有(private)虚拟继承问题

在下面的代码中,C类似乎无法访问A的构造函数,这是由于虚拟继承所必需的。然而,代码仍然可以编译和运行。为什么会起作用?classA{};classB:privatevirtualA{};classC:publicB{};intmain(){Cc;return0;}此外,如果我从A中删除默认构造函数,例如classA{public:A(int){}};classB:privatevirtualA{public:B():A(3){}};然后classC:publicB{};会(出乎意料地)编译,但是classC:publicB{public:C(){}};无法按预期编译。使用“g++(GC

C++从公共(public)静态方法访问私有(private)静态成员?

这个问题在这里已经有了答案:Whatisanundefinedreference/unresolvedexternalsymbolerrorandhowdoIfixit?(38个回答)关闭9年前。假设我有一个.hpp文件,其中包含一个带有公共(public)静态方法和私有(private)静态成员/变量的简单类。这是一个示例类:classMyClass{public:staticintDoSomethingWithTheVar(){TheVar=10;returnTheVar;}private:staticintTheVar;}当我打电话时:intResult=MyClass::DoS

c++ - 为什么不能在 lambda 中使用私有(private)方法?

有这样的类(class):classA{public:boolhasGrandChild()const;private:boolhasChild()const;vectorchildren_;};为什么不能像这样在方法hasGrandChild()中定义的lambda表达式中使用私有(private)方法hasChild()?boolA::hasGrandChild()const{returnany_of(children_.begin(),children_.end(),[](Aconst&a){returna.hasChild();});}编译器发出一个错误,即方法hasChild

c++ - 为什么派生*到基*之间的转换会因私有(private)继承而失败?

这是我的代码-#includeusingnamespacestd;classbase{public:voidsid(){}};classderived:privatebase{public:voidsid(){}};intmain(){base*ptr;ptr=newderived;//error:'base'isaninaccessiblebaseof'derived'ptr->sid();return0;}这会产生编译时错误。error:'base'isaninaccessiblebaseof'derived'既然编译器会尝试调用基类sid(),为什么会出现这个错误?有人可以解释一

C++11 lambdas 可以访问我的私有(private)成员。为什么?

考虑这段代码:classshy{private:intdont_touch;//Privatememberpublic:staticconstshyobject;};constshyshy::object=[]{shyobj;obj.dont_touch=42;//Accessingaprivatemember;compiles;WHY?returnobj;}();intmain(){}Livecode(Clang)Livecode(GCC)这对我来说似乎真的很不直观。C++11/14标准对此有何评论?这是GCC/Clang错误吗? 最佳答案