草庐IT

c++ - 传递派生类型列表,以便将它们存储为成员

我有一个类widget.我有一个抽象类base与衍生物derived_a,derived_b等我要widget保存从base派生的任意数量的对象以便以后多态地使用它们。我的第一次尝试是这样的:#include#include#include#includeclasswidget{public:explicitwidget(std::vector>&¶ms):members{std::move(params)}{}private:std::vector>members;};并且会这样调用:std::vector>v;v.push_back(std::move(std::make_

c++ - 将关键点转换为 mat 或将它们保存到文本文件 opencv

我在(opencv开源)中提取了SIFT特征,它们被提取为关键点。现在,我想将它们转换为矩阵(使用它们的x、y坐标)或将它们保存在文本文件中...在这里,您可以看到提取关键点的示例代码,现在我想知道如何将它们转换为MAT或将它们保存在txt、xml或yaml中...cv::SiftFeatureDetectordetector;std::vectorkeypoints;detector.detect(input,keypoints); 最佳答案 转换成cv::Mat如下。std::vectorkeypoints;std::vecto

c++ - 传递对 C++ 构造函数的引用并将它们保存为引用或非引用类型

我想知道这些是否基本相同。classExampleClass{public:ExampleClass(Object&newObj):obj(newObj){}private:Objectobj;}classExampleClass2{public:ExampleClass2(Object&newObj):objReference(newObj){}private:Object&objReference;}那么这对任何一个类都不起作用吗?ExampleClass*getExampleObject(){Objectobj;returnnewExampleClass(obj);}Exampl

C++ 返回对临时对象的引用或将它们存储在对象中

考虑以下处理const引用的代码:constint&func(constint&x){returnx;}structFoo{Foo(constint&x):m_x(x){}constint&getX(){returnm_x;}constint&m_x;};我想知道现在允许以下哪些(如果有的话):intx=func(int(7));inty=Foo(int(7)).getX();是否可以保证临时int对象在被赋值或getX使用之前仍然存在?更新:看来这是安全的-但究竟是为什么呢?是否因为临时对象以递归方式绑定(bind)到const引用,并且只要对它们的绑定(bind)引用存在,就保证存

c++ - 为什么这些函数局部静态对象的销毁顺序不是它们初始化顺序的倒序?

我有两个函数局部静态对象,一和二。One的构造函数和析构函数都通过GetTwo()访问Two:#includestructOne;structTwo;constOne&GetOne();constTwo&GetTwo();structTwo{constchar*value="It'stwo!";Two(){std::cout我用g++4.8.4编译它:g++-std=c++11[文件名]它输出:OneconstructTwoconstructtwovalis:It'stwo!Onedestructtwovalis:It'stwo!Twodestruct它们的构建和销毁顺序相同!我读到对

c++ - 复制构造函数、析构函数和赋值运算符。我们什么时候不需要它们?

我知道在你的类中添加cctor、dtor或op=时的C++经验法则,你还需要添加另外两个以使你的类在所有情况下都能正常工作。是否存在不需要提供全部三个而只需提供其中一两个的情况?如果您将其中一个添加到您的类中,为什么C++不要求您将它们全部添加?编辑1:当您不仅不需要其中一些,而且不想拥有它们时,您提到了示例,因此您希望将它们设为私有(private)或protected。但是即使是空体,您仍然需要在代码中编写它们。当你通过添加一个空主体的虚拟析构函数来使类多态时,我没有全部拥有它们的唯一正当理由。但是一旦你在析构函数的主体中写了一些东西,你就应该考虑在cctor和op=的主体中也写一

c++ - 我如何查看 Linux .so 或 .a 对象并查看它们包含哪些函数?

链接器大概可以做到这一点,那么是否有一个命令行工具可以列出目标文件中的函数并告诉我函数的名称及其签名? 最佳答案 对于共享库,您必须使用:nm-D/path/to/libwhatever.so.没有-D,nm转储debug符号;-D指的是实际用于动态链接的动态符号。来自Ubuntu12session:$nm/lib/i386-linux-gnu/libc.so.6nm:/lib/i386-linux-gnu/libc.so.6:nosymbols$nm-D/lib/i386-linux-gnu/libc.so.6|tail0011f

c++ - Tokens 的作用是什么以及为什么需要在 C++ 编程中创建它们?

我正在读一本书(BjarneStroustrup的《编程原理与实践》)。他在其中介绍了代币:“token是一个字符序列,代表我们认为是一个单位的东西,例如数字或运算符。这就是C++编译器处理其源代码的方式。实际上,以某种形式“标记化”是大多数文本分析的开始方式。”classToken{public:charkind;doublevalue;};我确实明白它们是什么,但他从未详细解释过这一点,这让我很困惑。 最佳答案 标记化对于弄清程序功能的过程很重要。Bjarne所指的与C++源代码相关的是程序含义如何受到标记化规则的影响。特别是,

c++ - 从 C++ 容器中移除对象而不删除它们

我正在使用C++stdvector来存储渲染对象以实现简单的场景图。我需要能够在运行时从场景图中添加和删除渲染对象。添加不是问题,对于删除:阅读文档vector和其他C++容器似乎在弹出对象时调用了它们的析构函数。这不是我需要的,因为我希望稍后能够将这些对象重新添加到渲染循环中。这个问题的可能解决方案是什么?我忘记提及的重要细节-我正在使用指向渲染对象的指针vector。 最佳答案 您似乎对对象实例的基本概念感到困惑。当您向vector添加某些内容时,您不会将其移动到其中,而是复制它:vectorvec;strings;vec.pu

c++ - 从 vector 中删除元素,如果它们也在另一个 vector 中

假设我有一个vectora={"the","of"}和一个vectorb={"oranges","the","of","apples".我想比较两个vector并从a中删除也在b中的元素。这是我想出的:for(inti=0;i但是这个循环并没有删除a中的最后一个元素。奇怪! 最佳答案 问题是,当您删除a的第一个元素时,索引会从0递增到1。在循环的下一次迭代中,vector的大小为1满足外层循环的条件导致它终止。您可以通过简单地使用std::remove_if、std::find和lambda来避免解决此问题可能需要的任何技巧。#in