草庐IT

c# - 计算每个派生类的类实例

有没有办法让所有派生类计算它们的实例?如何(用C++、C#、Java之一编写代码)?想象一下,我可以访问根类(例如对象),而其他所有类(直接或间接)都是从这个类派生的。我想要的是:AnyDerivedClass.InstancesCount()问题是,必须跟踪静态变量中的计数,但不可能将静态变量从基类“注入(inject)”到派生类中,这只适用于成员变量。也就是说,我必须写这样的东西:classobject{privatestaticintcount=0;protectedobject(){++count;}protected~object(){--count;}publicstati

c++ - 模板中的类使用不完整

我很惊讶在g++的各种采样版本上,以下编译没有错误或警告://Adaptedfromboost::checked_delete()templateinlinevoidassert_complete(){typedefchartype_must_be_complete[sizeof(T)?1:-1];(void)sizeof(type_must_be_complete);}classX;voidf(){assert_complete();}classX{};intmain(){}如果X的定义丢失或在不同的翻译单元中,我会得到错误。但是在上面的程序中,f的定义不就是我的模板的单一实例化点吗

c++ - 是否有可复制但不可 move 的类的用例?

看完thisrecentquestion@Mehrdad关于应该使哪些类不可move因此不可复制,我开始想知道是否有一个类的用例可以复制但不能move.从技术上讲,这是可能的:structS{S(){}S(Sconst&s){}S(S&&)=delete;};Sfoo(){Ss1;Ss2(s1);//OK(copyable)returns1;//ERROR!(non-movable)}虽然S有一个复制构造函数,但它显然没有模拟CopyConstructible的概念,因为那又是对MoveConstructible的改进概念,它需要存在(未删除的)move构造函数(参见第17.6.3.1

c++ - 有没有办法在 C++ 的类之外调用基函数?

这个问题类似,但是是关于从类内部调用函数:CanIcallabaseclass'svirtualfunctionifI'moverridingit?在这种情况下,您将指定Base::function()而不是function(),这将调用被覆盖的定义。但是有没有办法在类之外做到这一点?我的类没有定义复制构造函数,所以我不知道如何转换为基类:Base(derived_object).function()将&derived_object转换为Base*然后调用->function()是否合适?感谢您的洞察力。 最佳答案 试试derive

c++ - 什么是 C++ 中的类和对象?

什么是C++中的类和对象?我们可以说一个类是一个对象吗? 最佳答案 一个类就像一个蓝图,一个对象就像一个用蓝图build的房子。您可以拥有许多具有相同布局/平面图(读取类)的房屋,但每个房屋都是它自己的实例(读取对象)。每个人都有自己的主人、家具等。请注意,还有一些对象的蓝图不是类(例如整数)。 关于c++-什么是C++中的类和对象?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions

c++ - 从具有非虚拟析构函数的类中私有(private)继承是否安全?

我知道,公共(public)继承通常不是安全的,因为当delete基类指针时,编译器只生成代码来调用基类的析构函数,并且派生类的那个没有被调用。但是对于私有(private)继承,客户端不能将派生类指针转换为基类指针(因为私有(private)继承不模拟is-a关系),所以delete总是在派生类的指针上使用,编译器应该能够看到还有一个基类并调用它的析构函数。我做了这个测试:#includestructBaseVirtual{virtual~BaseVirtual(){std::coutGCC4.7.1和CLang3.1提供相同的输出。除非派生类本身将派生类指针强制转换为基类并删除,否

c++ - "friend"一个类是否扩展到该类中声明的类?

我有以下代码,其中A类将B类声明为friend。在B类中声明的C类是否应该能够查看A类的私有(private)声明/成员?使用CL版本16(VisualStudio2010)编译时没有错误,但gccg++版本4.1.1给出错误“typedefintA::Tisprivateinthiscontext”。函数调用作为typedef也会发生相同的行为(这就是我发现差异的方式)。classA{friendclassB;typedefintT;};classB{A::Tt;//oktypedefA::TU;//okclassC{Uu;//okA::Tv;//compileerrorongcc}

c++ - 嵌套在类模板中的类 X 的 operator<<(ostream&, X)

这个编译和工作正常(非嵌套模板):#includetemplateclassZ;templatestd::ostream&operator&){return(osclassZ{friendstd::ostream&operator(std::ostream&os,constZ&);};intmain(){Zz;std::cout这个不能编译(gcc4.4和gcc4.6,在03和0x模式下):#includetemplateclassZ;templatestd::ostream&operator::ZZ&){return(osclassZ{public:classZZ{friendstd

c++ - 多重或虚拟继承下的类的内存布局和vtable(s)?

我正在阅读“C++对象模型内部”,试图了解如何通过vtables实现多重和虚拟继承。(我非常了解单多态性)。当需要在虚拟继承期间或强制转换期间定位方法时,我很难理解究竟做了什么,因为要执行大量的偏移计算。是否有人能够帮助理解在多重继承或虚拟继承示例中如何使用多个vtable?如果我能理解布局和问题,我可能会更好地理解这个问题。 最佳答案 C++实现通常使用vtables来实现虚函数。vtable是指向函数的指针表。具有虚函数的类的每个对象都有一个指向包含该类所有虚函数地址的vtable的隐藏指针。在调用虚函数时,代码会计算函数指针在

c++ - 如果对象的类类型类似于 A::B,如何使用 GDB 从地址打印 c++ 对象成员

这个问题在这里已经有了答案:Whygdbcastingisnotworking?(4个回答)关闭6年前。从此链接gdbinterpretmemoryaddressasanobject我们知道,如果类类型A的对象位于特定地址,例如0x6cf010,那么我们可以使用:(gdb)p*(A*)0x6cf010打印此对象的成员元素。但是,当涉及c++命名空间时,这似乎不起作用。也就是说,如果类类型为A::B的对象,那么下面的所有尝试都不起作用:(gdb)p*(A::B*)0x6cf010(gdb)p*((A::B*)0x6cf010)那么,谁知道在这种情况下如何打印对象元素呢?我们可以使用以下经