草庐IT

c++ - 在不修改原有类的情况下添加虚函数

假设我们已经有了类的层次结构,例如classShape{virtualvoidget_area()=0;};classSquare:Shape{...};classCircle:Shape{...};etc.现在假设我想(有效地)向Shape添加一个virtualdraw()=0方法,并在每个子类中使用适当的定义。但是,假设我想在不修改这些类的情况下执行此操作(因为它们是我不想更改的库的一部分)。解决此问题的最佳方法是什么?我是否真的“添加”了一个virtual方法并不重要,我只想要给定一个指针数组的多态行为。我的第一个想法是这样做:classIDrawable{virtualvoid

c++ - 命名空间内类的友元函数

关于这段代码,我有两个问题:namespaceA{classwindow;}voidf(A::window);namespaceA{classwindow{private:inta;friendvoid::f(window);};}voidf(A::windowrhs){std::cout1)为什么我需要通过执行::f(window)将窗口类中的成员函数f限定为全局的?2)为什么在这种特殊情况下我需要预先声明函数f(A::window),而当类未在命名空间内定义时,可以在函数声明为friend之后声明函数. 最佳答案 当您将f()声

c++ - 非标准布局类的布局限制

编译器是否可以自由地对非标准布局类中的数据进行重新排序?比如是否允许改变struct{charx;private:shorty;public:charz;};到struct{private:shorty;public:charx;charz;}; 最佳答案 编辑:我最初记错了引用,允许编译器按照9.2/14执行此操作:Nonstaticdatamembersofa(non-union)classwiththesameaccesscontrol(Clause11)areallocatedsothatlatermembershavehi

c++ - 提取类的模板参数并迭代它们的最紧凑的方法是什么?

在下面的小程序中,我展示了我目前用于提取类的模板参数并通过递归辅助函数对其进行迭代的解决方案。我想知道是否有更简洁的方法来做到这一点,正如我在下面评论中的伪代码中所解释的那样。templatestructPack{};templatestructB{staticvoidfoo(){std::coutvoidfoo_helper(Pack&&){B::foo();foo_helper(Pack{});}//terminaterecursionvoidfoo_helper(Pack&&){}structA{typedefPackints;staticvoidfoo(){//thisiswh

c++ - 为什么不能覆盖涉及第三方代码的模板类的 operator<<?

我在https://stackoverflow.com/a/51951315/1908650中询问了以下内容:Iwanttooverloadtemplateostream&operator>&).在评论中,@Yakk-AdamNevraumont指出:Theanswertothatquestionis"youcannot".ThereisnogoodlegalwaytodothatforagenerictypeT;Icouldexplainwhy,butitwouldtakeanewquestion/answertodoso我正在创建一个新的Q.来接受这个提议...

c++ - 类的对象(使用单/多继承)有多少个 vptr?

一个对象通常需要多少个vptr,其clas(child)具有单一继承,基类多重继承base1和base2。识别一个对象有多少个vptr的策略是什么,它具有一对单继承和多继承。虽然标准没有具体说明vptrs但我只想知道一个实现是如何实现虚函数的。 最佳答案 你为什么关心?简单的答案是足够,但我猜你想要更完整的东西。这不是标准的一部分,所以任何实现都可以随心所欲,但一般的经验法则是,在使用虚拟表指针的实现中,作为第零近似值,用于您需要的动态调度至多指向虚拟表的指针与向层次结构中添加新虚拟方法的类一样多。(在某些情况下,可以扩展虚拟表,基

c++ - 无法使 C++ 中的私有(private)方法返回指向私有(private)嵌套类的指针

这个不想编译:classMainClass{public:...private:classNestedClass{//Line39...};classNestedClass*getNestedClassFor(inti);};编译器说:error:'classMainClass::NestedClass'isprivate但是,如果我将NestedClass设置为public,它就会起作用。为什么不起作用?这不是好像我正在通过公共(public)方法导出嵌套类吗?它只是一个私有(private)方法,返回一个指向私有(private)类的指针。有什么想法吗?谢谢!更新修复了半列。他们不

c++ - 同一个类中某个类的静态成员对象

假设我们有一个类classEgg{staticEgge;inti;Egg(intii):i(ii){}Egg(constEgg&);//Preventscopy-constructortobecalledpublic:staticEgg*instance(){return&e}};EggEgg::e(47);这段代码保证我们不能创建任何对象,只能使用静态对象。但是我们如何在类中声明同一个类的静态对象。还有一点,e是一个静态对象,静态对象只能调用静态成员函数,怎么会在这里调用静态对象e的构造函数,而且它的构造函数是私有(private)的。 最佳答案

c++ - 智能指针类的简单实现

在C++Primer13.5.1一书中,它使用Use-CountClass实现了一个SmartPointerClass。它们的实现如下:使用计数类//privateclassforusebyHasPtronlyclassU_Ptr{friendclassHasPtr;int*ip;size_tuse;U_Ptr(int*p):ip(p),use(1){}~U_Ptr(){deleteip;}};智能指针类/*smartpointerclass:takesownershipofthedynamicallyallocatedobjecttowhichitisboundUsercodemus

c++ - 初始化类的私有(private)成员变量

我提前道歉,因为我的一些措辞可能不是100%正确。我要上这样一个类:classClassName{private:AnotherClassclass2;public:ClassName();~ClassName();...在这个类的构造函数中,除其他外,我放了一行ClassName::ClassName(){AnotherClassclass2;}这就是我认为您应该在C++中初始化对象的方式,但是我注意到(通过GDB)正在创建两个AnotherClass对象。一次在构造函数定义上,然后再次在我的初始化行上。这背后的原因是什么?如果我想使用一个更复杂的构造函数,比如AnotherClas