草庐IT

Non-Base

全部标签

c++ - 将 std::map<int, std::shared_ptr<Base>> 转换为 std::map<int, std::shared_ptr<Derived>> 的最有效安全方法

我们目前存储了几个不同的数据模型集合,如下所示:std::map>>models;字符串映射到一个已知的类型列表,这都是通过序列化处理的。嵌套映射包含“对象ID”和关联(反序列化)std::shared_ptr的集合DataObject是一个基类,我们从中派生出多种类型。我们有一个方法来获取给定类型的所有数据对象:staticstd::map>*getAll(std::stringtype);这只是在给定的“类型”键处返回指向map的指针。今天我遇到了一个代码审查来添加我认为调用UB但似乎起作用的以下内容。这让我有点紧张并寻找有效的解决方案:templatestaticstd::map

c++ - 智能指针 : cast between base and derived classes

假设你有这样一个函数:SmartPtrdoSomething(SmartPtra);像这样的类:classA{}classB:publicA{}现在我这样做:SmartPtrfoo=newB();doSomething(foo);现在,我想取回一个SmartPtr来自doSomething的对象.SmartPtrb=doSomething(foo);这可能吗?我需要做什么样的选角?现在,我刚发现一些我认为丑陋的东西:B*b=(B*)doSomething().get()重要说明:我无权访问SmartPtr和doSomething()代码。 最佳答案

c++ - 将 vector<shared_ptr<Derived>> 传递给需要 vector<shared_ptr<Base>> 的函数

我使用的代码结构有问题,如下(简化):classSPoint{public:SPoint(doublex,doubley,doublez):_x(x),_y(y),_z(z){}protected:double_x,_y,_z;}classPoint3D:publicSPoint{public:Point3D(doublex,doubley,doublez):SPoint(x,y,z){//defaultvaluesforUandV}protected:doubleU,V;}这些点用于创建折线:classSPolyline{public:SPolyline(constvector>&p

c++ - 嵌套类声明 : template vs non-template outer class

我有一个C++模板类,里面有一个嵌套类,比如:templateclassOuter_t{public:classInner;Inneri;};templateclassOuter_t::Inner{public:floatx;};intmain(){Outer_to_t;//3oranyarbitraryinto_t.i.x=1.0;return0;}编译没有任何问题。然而,一旦我声明了一个类似的非模板类,就像这样:classOuter_1{public:classInner;Inneri;};classOuter_1::Inner{public:floatx;};intmain(){

eclipse报错Errors running builder ‘Android Package Builder‘ on project ‘xxx‘. sun/misc/BASE64Encoder

eclipse报错Errorsrunningbuilder‘AndroidPackageBuilder’onproject‘xxx’.sun/misc/BASE64Encoder由于毕设是需要用到安卓,所以这段时间都在学习安卓开发的相关知识,碰到了如下的问题,困扰了许久,今晚终于解决了,发出来给有需要的人参考一下~本人是小白,第一次发博客,如有说的不对的地方,还望大佬们指正[抱拳]。问题描述搭建完eclipse环境之后,运行安卓项目一直不成功,一直报如下的错误:Errorsrunningbuilder'AndroidPackageBuilder'onproject'Myapplication'

c++ - 当 Base 和 Derived 都使用 Derived 类型参数进行模板化时调用 Base 构造函数时出现编译器错误

我很难理解为什么以下代码无法编译:templateclassBase{public:Base(inta){}};templateclassDerived:publicBase{public:Derived(inta):Base(a){}};intmain(){}在我的编译器(gcc5.4.0withC++11)上输出错误信息error:class'Derived'doesnothaveanyfieldnamed'Base'Derived(inta):Base(a){}我看到这有点类似于Templatebaseconstructorcallinmemberinitializationli

c++推导 "non type pointer to function"类模板参数

考虑一个模板类:templateclassProxy{voidrun(){ReturnTyperet=Fn();//...dosomething...}};//andafunctionsintfn1(){return5;}floatfn2(){return5;}这可以通过使用实例化:Proxyp1;但是显式声明返回值类型似乎是不必要的。我想要实现的是:someProxyInstantationp1;someProxyInstantationp2;不幸的是,我对c++没有任何期望,这似乎是该语言的一个隐藏角落(至少对我而言)。如果我可以从指向函数的指针获取它的类型——类似于:std::t

c++ - 奇怪的转换问题 Derived to Base in C++

我有三个类:Base、Derived(继承自Base)和Stats(使用Base)。该程序创建了一个Derived对象,该对象在程序执行期间可能会被多次删除和重建。它还设置了一个只会创建一次的Stats对象,但需要在Derived对象的Base上调用函数。因为Derived对象可能会被重构,Stats对象需要引用Base的指针,因为指针的值可能会改变。但是,当我在main中构造一个新的Derived时,Stats类中的引用看不到新对象。在下面的例子中,d和m_obj都是null,那么当我创建一个新的Derived实例时,m_obj仍然是null。这对我来说没有意义。更令人困惑的是,如果

c++ - 如何将二进制字符串转换成base64编码的数据

我正在接收字符串中的二进制数据。我想将其编码为Base64。是否有任何类可以执行该操作(我想要一个API)。 最佳答案 CryptBinaryToString...如果您针对Windows平台这是一个小例子:#include#pragmacomment(lib,"crypt32.lib")intmain(){LPCSTRpszSource="Manisdistinguished,notonlybyhisreason,but...";DWORDnDestinationSize;if(CryptBinaryToString(reinte

c++ - begin() 如何知道要返回哪种返回类型(const 或 non-const)?

这非常有效:listl;list::const_iteratorit;it=l.begin();list::iteratorit2;it2=l.begin();我不明白list是怎么来的“知道”它必须返回iteratorbegin()版本或const_iteratorbegin()const一个。我正在尝试为我的容器(一个trie)实现迭代器,但我遇到了这个问题。难道C++不应该不按返回类型处理差异化(除非使用奇怪的技巧)?这是一些代码和我得到的编译器错误:我的Trie是一个模板化的trie,可以包含任何类型。我有一个Trie::iter非常量迭代器和一个Trie::const_ite