向下转换并同时从 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的主要内容,如果未能解决你的问题,请参考以下文章

将 Array 转换为 Hash 删除重复键并同时添加值

从 CArchive 读取 WORD 变量并同时转换为 int

使用函数时从整数转换为字符串

转换输入时间时从字符串转换日期和/或时间时转换失败 | SQL, SQLSRV

转换为列表时从数据框中删除某些列

为啥首先允许指针从非常量到常量的隐式转换?