草庐IT

c++ - 为什么我不能有模板和默认参数?

我更改了函数中的参数以使用模板接受任何类型的对象,但我不能将它与其他默认参数结合使用,我是否遗漏了什么?#include#includeclassMyClass{public:std::wstringmsg=L"hey";MyClass(){};};classMyClass2{public:templateMyClass2(T*t,inti);};templateMyClass2::MyClass2(T*t,inti=0){std::wcoutmsg输出:practice.cpp:16:32:error:redeclarationof'MyClass2::MyClass2(T*,int

c++ - C++ 类的全局实例

正如标题所说。我将如何创建一个全局可用的类的实例(例如,我有一个用于打印的仿函数,我想拥有它的一个全局实例(尽管有可能创建更多实例))。 最佳答案 竭尽全力使用通常的模式制作单例对象并不能解决问题的第二部分-如果需要,可以制作更多。单例“模式”非常严格,只不过是另一个名称的全局变量。//myclass.hclassMyClass{public:MyClass();voidfoo();//...};externMyClassg_MyClassInstance;//myclass.cppMyClassg_MyClassInstance;

c++ - 如何使用指针为 c++ priority_queue 实现排序方法

我的优先队列声明为:std::priority_queuequeue;classMyClass{booloperator不对队列中的项目进行排序。怎么了?我不想实现不同的(比较)类。答案摘要:问题是,指针地址是排序的。避免这种情况的唯一方法是“比较指针”的类。现在实现为:std::priority_queue,MyClass::CompStr>queue;classMyClass{structCompStr{booloperator()(MyClass*m1,MyClass*m2);}} 最佳答案 将比较仿函数ptr_less赋给查

c++ - 使类对 C++ 中的其他类公开

如果我有两个类,例如如下:classA{...}classB{...}如果我想让A类对B类公开,我是只公开A类的成员还是我可以使用publicclassA{...}?有没有办法告诉B类,例如只有A类对你公开?换句话说,我可以将公共(public)类设为Aprotected或对其他人私有(private)吗?或者,这只是派生类(继承)的问题?谢谢。 最佳答案 将类公开和将其内容公开之间有很大区别。如果您在包含文件(.h文件)中定义您的类,那么您就是在公开您的类。包含此包含文件的所有其他源文件都将了解此类,并且可以例如有指向它的指针。将

c++ - 为什么返回时调用的是拷贝构造函数而不是 move 构造函数?

假设我有类(class)MyClass具有正确的move构造函数并且其复制构造函数被删除。现在我像这样返回这个类:MyClassfunc(){returnMyClass();}在这种情况下,move构造函数在返回类对象时被调用,一切都按预期进行。现在假设MyClass有一个的实现运算符(operator):MyClass&operator当我更改上面的代码时:MyClassfunc(){returnMyClass()我收到编译器错误,复制构造函数无法访问,因为它已被删除。但为什么在这种情况下完全使用复制构造函数? 最佳答案 NowI

c++ - 在不调用构造函数的情况下在堆栈上分配内存

我想在下面的代码中将MyClass保留在堆栈内存中(更简单、更快),但避免调用默认构造函数:#includeclassMyClass{public:MyClass(){std::cout1)something=1;elsesomething=0;MyClassc;if(something)c=MyClass(1);elsec=MyClass("string");c.doStuff();return0;}据我所知,避免调用默认构造函数的唯一方法是使用指针,但那样我就必须在堆中进行分配并处理内存管理。还有其他办法吗? 最佳答案 如果您不

c++ - 在初始化该类的静态对象之前,是否保证初始化该类的静态成员?

我最近在一次代码审查中遇到了这个C++静态初始化顺序相关的查询。我在编译单元中有一个带有静态成员变量的类我有一个在不同编译单元中使用构造函数的类的静态对象这里,我想知道静态成员变量是否保证在调用静态对象构造函数之前被初始化?MyClass.h:typedefint(*MyFunc)(int);classMyClass{MyClass(MyFuncfptr){mFunc=fptr;}staticMyFuncmFunc;}MyClass.cpp:MyFuncMyClass::mFunc=nullptr;MyDifferentClass.h:MyDifferentClass{public:s

C++ 命名空间 'using' 类枚举的声明

我非常了解C++“using”声明和指令的工作原理。但是,我对此感到难过......也许这是不可能的?我想避免对我的枚举变量进行质量检查:namespaceFoo{classMyClass{public:enumMyEnum{X,Y,Z};}}现在,从该命名空间之外,我希望能够执行以下操作:usingFoo::MyClass.MyEnum;MyEnumletter=MyEnum::x;但显然这不是解决问题的方法?我打赌这是可能的,但我的符号是错误的...我也尝试使用Foo::MyClass::MyEnum,但编译器认为Foo::MyClass是一个命名空间。补充:如您所见,必须完全声明

c++ - 我可以使用 std::vector 作为预分配(原始)数组的外观吗?

我已经从DirectX获得了一个内存位置,其中存储了我的顶点信息。处理顶点信息的一种极其方便的方法是使用包含顶点信息的结构的std::vector。鉴于我有一个指向大缓冲区的指针,我可以使用std::vector来管理缓冲区中的元素吗?定期构造一个std::vector会导致它有自己的地址,这并不是我真正想要的。我能以某种方式使用新的运算符放置吗? 最佳答案 是的,你可以。使用customallocator.在此分配器中,您的DirectX内存的返回地址。这是一个基于CompellingexamplesofcustomC++STLa

c++ - 使用 d 指针的优点和缺点是什么?

d指针在Qt中大量使用,它们是pimplidiom的一种实现。我知道pimpl习语的优点和缺点。但是我错过了d-pointers实现的优势。Here和here是d指针的样本。只用这个不是更简单吗?classMyClassPrivate;classMyClass{//interfacemethodsprivate:MyClassPrivate*pimpl_;}; 最佳答案 d指针是pimpl模式的众多实现之一。它也是早期的实现之一:“‘d-pointer’这个名字源于Trolltech的ArntGulbrandsen,他首先将这项技术