草庐IT

C++ 对类数据成员的引用

这个问题在这里已经有了答案:Whydoesn'treference-to-memberexistinC++?(1个回答)关闭6年前。我最近才发现类数据成员指针的存在,例如:classCar{public:intspeed;};intmain(){intCar::*pSpeed=&Car::speed;return0;}对类数据成员的引用是否也存在?如果是这样,声明它们的语法是什么?

c++ - 这是对类(Class)友情的恰当运用吗?

在创建Windows父类和子类对话框时,让子类成为父类的友元以访问其私有(private)数据通常是个好主意还是应该使用访问函数? 最佳答案 很少需要friend-通常是当您需要在一个类中重新实现一些深层行为而不重写它以便它们都从单个基类继承或不提供大量访问者时。只有一次我需要它是在ActiveX中重写一个基于openGL的渲染器——当我需要获取大量低级模型数据,但不能(出于非技术原因)重新实现一个通用的ABC时。 关于c++-这是对类(Class)友情的恰当运用吗?,我们在StackO

c++ - 没有对类成员的匹配函数调用

我已经实现了一个通用列表,我正在尝试从列表中的某个位置检索数据。嗯......但我收到一个错误:没有匹配函数来调用'List::retrieve(int&,Record&)'下面是main.cpp的代码和从List.h中检索的函数片段。#includemain.cpp#include#include"List.h"#include"Key.h"usingnamespacestd;typedefKeyRecord;intmain(){intn;intp=3;Listthe_list;Recorddata;cout>n;for(inti=0;iList.hError_coderetriev

c++ - 返回对类数据成员的引用,然后尝试更改该成员

我看过其他关于此的帖子,但还没有真正了解会发生什么。假设我有这段代码:templatestructS{S(Tvalue):val{value}{}T&get(){returnval;}private:Tval;};intmain(){Ss1{5};intn=s1.get();n=10;std::cout这会打印出:5我的问题是,如果我返回对val的引用,为什么没有值当我改变n的值时val的变化? 最佳答案 当您将结果存储在intn中时,您会创建一个拷贝。尝试:int&n=s1.get();

c++ - 为什么重载赋值运算符会返回对类的引用?

classitem{public:item&operator=(constitem&rh){......return*this;}};下面的签名有错吗?voidoperator=(constitem&rh);itema,b;a=b;//equivalenttoa.operator=(b);sothereisnoneedtoreturnthis. 最佳答案 这不是“错误”,而是令人惊讶。赋值计算为目标对象。这就是内置的含义。如果您为自己的类(class)定义不同,人们可能会感到困惑。例子:intc;while((c=getchar()

c++ - 当我在 C++ 中对类模板进行完全特化时,为什么我不必定义相同的成员?

我很惊讶地发现以下编译:#includeusingnamespacestd;templateclassSomeCls{public:voidUseT(Tt){coutclassSomeCls{//NoUseT?WTF?!??!?!};intmain(intargc,char*argv[]){SomeClsd;SomeClsi;d.UseT(3.14);//Uncommentingthenextlinemakesthisprogramuncompilable.//i.UseT(100);return0;}为什么允许这样做?classSomeCls似乎是错误的不需要voidUseT(Tt)

c++ - 静态函数对类构造的好处

我见过这样的代码,所以我想找原因。使用充当构造函数而不是实际构造函数的静态函数的主要原因是什么?我的意思是:classMyClass{public:staticMyClassCreateFrom(bar);staticMyClassCreateFrom(foo);...}代替:classMyClass{public:MyClass(bar);MyClass(foo);...} 最佳答案 这被称为“命名构造函数惯用语”。通常在以下情况下使用:您有很多具有足够相似参数列表的ctors,重载的ctors会造成混淆(例如,整数和float的

c++ - 在 gdb 中跟踪对类实例/内存范围的写访问

我正在尝试调试我在大学类(class)中用C++编写的小型操作系统。在运行时某处我的对象之一被损坏。这似乎是由于不小心写入了错误的内存地址而发生的。由于我无法从纯看代码找到发生这种情况的地方,我需要另一种方式。由于这是一个操作系统,我无法将valgrind之类的工具附加到它,但我可以在附加了gdb的模拟器(bochs/qemu)中运行它。gdb中是否有一种方法可以跟踪对类实例或更一般的特定内存范围的写访问?我想在写访问发生时立即中断,这样我就可以验证这是否有效。 最佳答案 你可以放置一个观察点:watchx当x被修改时,这将中断。x

c++ - 我可以对类对象执行此操作吗?

classxyz{......};while(i我是否需要先销毁之前的对象,然后再为其重新分配内存? 最佳答案 没有。ob是一个堆栈分配的对象,所以它自己的生命周期是自动管理的。它在您声明它的地方构造,在"}"处析构。由于每次while迭代都是单独的{...}范围,因此每次迭代都会构造和销毁对象。 关于c++-我可以对类对象执行此操作吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questio

c++ - 如何对类定义中定义的模板成员函数使用显式模板实例化?

为了减少大量使用模板的大型项目的编译时间,我使用“外部模板”(explicittemplateinstantiation)来防止在许多不同的编译单元中定义通用模板函数,取得了很好的效果.但是,一件令人讨厌的事情是它不适用于类定义中定义的成员函数。例如,我有以下模板类:templatestructFoo{staticTdoubleIt(Tinput){returninput*2;}};现在,我知道Foo最常用于数字类型,所以我将其添加到标题中:externtemplatestructFoo;externtemplatestructFoo;externtemplatestructFoo;然