Dynamic_cast from "void *"
根据 this ,void*没有RTTI信息因此,从void*中铸造是不合法的,这是有道理的. 如果我没记错的话,dynamic_cast从void*开始在GCC上工作. 您可以澄清这个问题. 解决方案 dynamic_cast仅适用于多态性类型,即包含虚拟函数的类. 在GCC中,您可以dynamic_cast to void*,但不是:: struct S { virtual ~S() {} }; int main() { S* p = new S(); void* v = dynamic_cast(p); S* p1 = dynamic_cast(v); // gives an error } 其他解决方案 in 5.2.7 - Dynamic cast [expr.dynamic.cast]它说dynamic_cast(v): 如果T是指指指针类型,v应为完成类型的指针的rva
0 2023-11-25
编程技术问答社区
从编译器设置中关闭RTTI的优点是什么?
通过此( rtti多么昂贵?),似乎很明显动态铸造是比静态类型比较贵得多,但我想知道是否值得关闭编译器选项中的RTTI选项(VS2010,/gr-) 我的代码中没有动态铸件(我用静态铸件代替了它们).但是(/gr-)选项除了在使用动态铸造时发出错误以外是否有其他操作?其中是否有内存或代码优化? 预先感谢. 解决方案 直来自msdn (强调): /gr打开时,编译器定义了_cpprtti预处理器宏.默认情况下,/gr已打开./gr-禁用运行时类型信息. 使用/gr如果编译器无法在代码中静态解析对象类型.当您的代码使用Dynamic_cast Operator或TypeID时,通常需要/GR选项.但是,/gr增加了图像的.rdata部分的大小.如果您的代码不使用Dynamic_cast或typeID,/gr-可能会产生较小的图像. 在您的情况下,关闭RTTI是值得的. 其他解决方案 可能有一些内存减少(因为不需要RTTI所需的数据),但是在大多数
2 2023-11-20
编程技术问答社区
从一个基类指针访问子类成员 C++
我有一系列自定义课程的学生对象. Coursestudent和Researchstudent都从学生那里继承,所有学生的实例都是其中之一. 我有一个函数可以通过数组,确定每个学生的子类型,然后在其上调用特定于亚型的成员功能. 问题是,因为这些功能没有超载,因此在学生中找不到它们,因此编译器大惊小怪. 如果我有指向学生的指针,是否有办法将指针指向该学生的子类型?我需要在这里做某种假铸件以解决编译时错误吗? 解决方案 您需要动态铸件: Student * s = new ...; // Create student of some sort. if ( ResearchStudent * r = dynamic_cast( s ) ) { r->ResFunc(); } else if ( CourseStudent * c = dynamic_cast( s ) ) {
0 2023-11-19
编程技术问答社区
dynamic_cast a rvalue-reference unique_ptr?
我有一个类Base和一个派生的类Derived. 一个函数从文件描述符读取对象并返回Base对象: std::unique_ptr readNextThing(); 在某个地方,我需要降低此功能的返回值.这很重要,因为输入unique_ptr是rvalue-reference,因此我们不复制指针,而是将其移动.在这种特定情况下,如果不是Derived subtype,我不介意被破坏的对象,我只需要检测到在这种情况下的下降指针是无效的. 我可以做: template std::unique_ptr dynamic_unique_cast(std::unique_ptr && unique) { T * t = dynamic_cast(unique.get()); if(t) { unique.release(); } //Transfer ownership r
4 2023-11-07
编程技术问答社区
如何用unique_ptr执行dynamic_cast?
我的类层次结构如下: class BaseSession : public boost::enable_shared_from_this class DerivedSessionA : public BaseSession class DerivedSessionB : public BaseSession 在派生的类函数中,我经常调用这样的函数: Func(boost::dynamic_pointer_cast(shared_from_this())); 由于我正在与shared_ptr一起管理会议,因此工作正常.最近,我发现我对shared_ptr的使用并不是最佳的.那是因为这些会话是每个客户端维持一个插座的单例对象.如果重新连接了插座,则会副本用于僵尸. 作为解决方法,我开始通过参考而不是副本传递shared_ptr.这解决了僵尸问题. 理想情况下,我觉得我应该使用unique_ptr存储会
4 2023-11-07
编程技术问答社区
C++ dynamic_cast与在静态枚举中存储对象类型的对比?
我正在为一个框架的框架开发一个大的课程结构,该框架需要大量的铸造. 我的问题是,一个想法是多么愚蠢的静态成员,该静态成员使用枚举将所有对象类型存储在层次结构中.让每个类的成员静态不会增加当前的对象大小,并且会在运行时比Dynamic_cast更快地确定对象的类型. 至少这是基本思想.这种方法将有多足够,并且存在潜在的缺陷吗? 解决方案 我不知道您将如何从对象之间共享的静态变量中确定每个对象的类型.除非您对每个类都覆盖了一些虚拟函数,否则您根本不需要静态变量,只需执行这样的操作: struct Base { virtual int type() = 0; }; struct Derived1 : public Base { virtual int type() { return 1; } }; struct Derived2 : public Base { virtual int type() { return 2; } }; 不是最快的
2 2023-10-30
编程技术问答社区
dynamic_cast的正确用例是什么?
我多次被告知(在实践中看到自己),动态cast的使用通常意味着不良设计,因为它可以并且应该用虚拟功能代替. 例如,考虑以下代码: class Base{...}; class Derived:public Base{...}; ... Base* createSomeObject(); // Might create a Derived object ... Base* obj = createSomeObject(); if(dynamic_cast(obj)){ // do stuff in one way } else{ // do stuff in some other way } 可以很容易地看到,而不是编写动态铸件,我们可以将虚拟函数doStuff()添加到Base中,然后在Derived中重新实现它. 在那种情况下,我的问题是,为什么我们根本有Dynamic_cast?是否有一个示例使用Dynamic_cast的使用是合理的?
2 2023-10-30
编程技术问答社区
重构建议。如何在这个OO设计中避免类型检查
我正在寻找有关重构的建议,以改善我的课程设计并避免使用类型检查. 我正在使用命令设计模式来构建菜单树.菜单中的一个项目可能是各种类型的(例如,即时操作[例如" save"],一个切换开/关属性,根据其状态(例如"斜体"]等状态,以check/cont/图标显示).至关重要的是,还有子菜单,替换(而不是显示到屏幕上的当前菜单的侧面).这些子菜单当然包含自己的菜单项列表,这些菜单项可能具有更多的嵌套子菜单. 代码类似于(所有公开为简单的演示文稿): // Abstract base class struct MenuItem { virtual ~MenuItem() {} virtual void Execute() = 0; virtual bool IsMenu() const = 0; }; // Concrete classes struct Action : MenuItem { void Execute() { /*...*/ }
2 2023-10-30
编程技术问答社区
有什么方法可以在C#中进行动态隐式类型铸造?
给予与隐式铸造运算符的同类: public class MyDateTime { public static implicit operator MyDateTime(System.Int64 encoded) { return new MyDateTime(encoded); } public MyDateTime(System.Int64 encoded) { _encoded = encoded; } System.Int64 _encoded; } 我现在可以执行以下操作: long a = 5; MyDateTime b = a; 但没有以下内容: long f = 5; object g = f; MyDateTime h = g; 这给出了编译时间: 不能将类型的"对象"隐式转换为" mydateTime". 对我很有意义. 现在我修改了
6 2023-10-30
编程技术问答社区
将 "this "作为返回值进行动态投递可以吗?
这更多是一个设计问题. 我有一个模板类,我想根据模板类型添加额外的方法.要实践干燥原则,我提出了这种模式(定义是故意省略的): template class BaseVector: public boost::array { protected: BaseVector(const T x, const T y, const T z); public: bool operator == (const Vector &other) const; Vector operator + (const Vector &other) const; Vector operator - (const Vector &other) const; Vector &operator += (const Vector &other) { (*this)
4 2023-10-20
编程技术问答社区
在构造函数中动态的 "this "的cast
这个问题与这个问题非常相似为什么可以'在多个继承期间dynamic_cast"侧向"?,除了演员表是否有效 - 只是在构造函数中没有内部. 标题: class A { public: virtual ~A() {} void printA(); }; class B { public: B(); virtual ~B() {} void printB(); private: std::string message_; }; class C : public A, public B { public: C() {} virtual
4 2023-10-20
编程技术问答社区
C++动态降级到类模板,模板参数是类模板或别名模板
我希望标题有意义.我可能会想念词汇正确表达. 好吧,一个景象可能会更清楚. 对我的问题是:在以下一些情况下,动态降低的返回0(以评论为书面).我想知道这是否是正确的行为(使用C ++ 11),这也是为什么,以及我该怎么做才能使它起作用.显然,模板和A :: a_templplated被视为不同的类,尽管通过使用"使用"的别名将其定义为相同的类别.对于简单的Typedef别名,问题不会出现. template class Templated {}; class A { public : typedef int A_Type; template using A_Templated = Templated; }; class Test_base { public : Test_base() {} virtual void foo()=0; }; template
4 2023-10-15
编程技术问答社区
向数据库插入新对象时出现Swift dynamicCast错误
我有一个词典,我有所有要插入数据库作为新对象的数据.问题是当我尝试施放新创建的对象时,它给了我以下例外: libswift_stdlib_core.dylib`swift_dynamicCast: 组装代码的一部分. 我使用的代码就是这样: var group:Group if (array.count == 0) { group = NSEntityDescription.insertNewObjectForEntityForName("Group", inManagedObjectContext:appDelegate.managedObjectContext) as Group } 和小组类的结构是这样的: @objc(Group) class Group:NSManagedObject{ @NSManaged var createDate:NSString @
2 2023-10-09
编程技术问答社区
dynamic_cast<>的速度如何?
...与典型的std::string::operator==()相比?我在下面提供更多详细信息,我不确定它们是否有意义.复杂或近似的答案足够好.谢谢! 详细信息:我将在列表上循环中使用它来查找一些特定实例.我估计我的平均继承水平为3.5类.我正在寻找的那个有父母课程,一个祖父母,而不是两个"接口",即带有几个virtual void abc() = 0;的抽象课程. 我要寻找的没有子类. 解决方案 它在很大程度上取决于您的编译器,您的特定类层次结构,硬件和各种因素.您确实需要直接在特定应用程序中进行测量.您可以使用 rdtsc 或(在Windows上) US/Library/Windows/Desktop/MS644904%28V = vs.85%29.apx"> QueryPerformanceCounter 为此目的获得相对较高的精确计时器.请确保数千dynamic_cast s的时间循环或雪橇,因为即使 QPC 仅具有1/4μs的分辨率. 在我们的应用程序
8 2023-09-29
编程技术问答社区
检查交叉铸造是否有可能成功?
我知道,使用dynamic_cast在类层次结构上进行"交叉铸造"是合法的.例如,如果我的课程看起来像这样: A B \ / C 如果我有一个指向类型C对象的指针,那么我可以使用 A* aPtr = /* ... something that produces a C* ... */ B* bPtr = dynamic_cast(aPtr); 要获取指向C的B基本对象的指针. 我提到这一点的原因是,在我编写上述代码时,即使看到A和B,编译器也可能尚未看到C的定义.这意味着编译器可能无法检测到A和B之间的任何连接,但是它仍然必须对代码进行编译,因为这样的类可能存在C的类,并且对于在某些情况下取得成功. 问题在于,这意味着我可以意外地对错误类型的对象进行交叉交叉.假设我的课程看起来像这样: A B D \ / C 这里,D是一些随机的无关类.如果我尝试写这样的东西: A* aPtr = /*
4 2023-09-29
编程技术问答社区
在使用boost::dynamic_pointer_cast时,C++:"...不是一个多态类型"
为什么我会收到以下代码的以下错误? 1>C:\Libs\boost_1_44\boost/smart_ptr/shared_ptr.hpp(259): error C2683: 'dynamic_cast' : 'my_namespace::A' is not a polymorphic type 1> D:\[location]\[header_filename].h(35) : see declaration of 'my_namespace::A' 1> C:\Libs\boost_1_44\boost/smart_ptr/shared_ptr.hpp(522) : see reference to function template instantiation 'boost::shared_ptr::shared_ptr(const boost::shared_ptr
2 2023-09-01
编程技术问答社区
在一个shared_ptr上的dynamic_cast?
我有两个A和B,B,B继承. 如果我有一个shared_ptr对象我知道确实是B子类型,我该如何执行动态铸件来访问B的API(牢记我的对象是共享的_ptr,而不仅仅是a? 解决方案 如果您只想从B调用功能,则可以使用其中之一: std::shared_ptr ap = ...; dynamic_cast(*ap).b_function(); if (B* bp = dynamic_cast(ap.get()) { ... } 如果您实际上想从std::shared_ptr获得std::shared_ptr,则可以使用 std::shared_ptr bp = std::dynamic_pointer_cast(ap); 其他解决方案 使用从上面链接复制的示例 // static_pointer_cast example #include #include
4 2023-09-01
编程技术问答社区
使用对象的类型进行动态投掷 C#
我有一个名为A的抽象类(b,c,d,e,...),该类实现A 我也有一个对象列表. 我希望能够将该列表中的每个对象动态施放到其"基础"类型(即B,C,D,...),以便以其他方法调用其构造函数. 这是我现在所做的: abstract class A { } class B : A { } class C : A { } class D : A { } class E : A { } // ... class Program { static void Main(string[] args) { List list = new List { new B(), new C(), new D(), new E() }; // ... foreach (A item in list) { A obj = foo(item); }
14 2023-08-04
编程技术问答社区
如何使用dynamic_cast操作符识别失败的转换?
Scott Meyer在他的书中Effective C++说dynamic_cast用于执行安全的铸造或跨继承层次结构.也就是说,您使用dynamic_cast将指针或引用到基类对象中的指针或引用对派生或同级基类对象的指示,以便您可以确定演员表是否成功. . 失败的铸件由空指针(铸造指针)或异常(铸造引用时)表示. 我想获得两个代码片段,显示在铸造指针和铸造参考的情况下显示失败的铸件. 解决方案 对于指针,这是一个简单的空检查: A* a = new A(); B* b = dynamic_cast(a); if (b == NULL) { // Cast failed } 对于参考,您可以捕获: try { SomeType &item = dynamic_cast(obj); } catch(const std::bad_cast& e) { // Cast failed } 其他解决方
14 2023-08-03
编程技术问答社区