向下转换并同时从 const 转换为 non-const
Posted
技术标签:
【中文标题】向下转换并同时从 const 转换为 non-const【英文标题】:Downcast and convert from const to non-const at the same time 【发布时间】:2012-05-14 13:11:33 【问题描述】:我在转换参数时遇到了一些问题:
我有这个结构:
class XMLCO
...;
class CO: public XMLCO
...;
而我的问题在于构造函数中的这个类:
class ProcessUnit
public:
ProcessUnit( const CO& co );
private:
NetComm _ipComm;
;
需要使用 XMLCO 初始化对象 _ipComm(NetComm 类型),但是在这个构造函数中,我只得到了一个继承 XMLCO 的 CO,所以我虽然可以在构造函数中做某种向下转换:
ProcessUnit::ProcessUnit( const CO& co )
CO temp = const_cast<CO>( co ); // to remove the const -- THIS LINE CAUSE THE PROBLEM (it gives me this error: the type in a const_cast must be a pointer or reference to an object type
CO* ptrTemp = &temp; // to make it a pointer
XMLCO* xmlcc = dynamic_cast<IOXMLDescCreationContext*>( ptrTemp );
_ipComm = new IONetworkComm( *xmlcc );
我想知道是否有更简单的方法来执行此操作(不对通用结构进行任何更改)或者我做错了什么。
谢谢
【问题讨论】:
对于 const_cast 原始类型和目标类型必须匹配,但 const 说明符除外。在类型声明中保留“&”。 【参考方案1】:需要用 XMLCO 初始化对象 _ipComm(NetComm 类型),但是在这个构造函数中,我只得到了一个继承 XMLCO 的 CO,所以我虽然可以做一些向下转换
在你的情况下,你不能向下,只能向上。幸运的是,这个演员表是隐式的。因此,您无事可做。您可以分配:
CO temp = co;
但请注意,此 复制 对象。这真的是你想要的吗?此外,删除const
可能不仅没有必要,而且是错误的。即使您更正了代码中的语法,这仍然行不通。不过,要正确诊断此问题,您需要发布其他定义。
【讨论】:
+1。此外,明确地说Co temp = co;
完全有效可能会更容易。
+1 但我不确定这是他想要的,没有参考他可能会得到原始数据的副本
@Adriano 这也是我在回答中明确提到的。
对不起,我越来越懒了...我的眼睛开始阅读每一个奇怪的行! ;)【参考方案2】:
不要使用 const_cast
,因为这里没有必要 - 看起来你的问题与参数的常量性无关,因为 _ipComm
可能会通过 的副本初始化> co
.
问题可能是IONetworkComm
的构造函数接受了一个非常量对象。如果是这种情况并且这不是一个错误,那么它会告诉您有关 IONetworkComm
设计的一些信息——即它需要从非常量对象初始化。也许您应该在 ProcessUnit
类的构造函数中反映这一点?也许应该是:
ProcessUnit( CO& co );
【讨论】:
以上是关于向下转换并同时从 const 转换为 non-const的主要内容,如果未能解决你的问题,请参考以下文章
从 CArchive 读取 WORD 变量并同时转换为 int