【问题标题】:C++ Pointers ConversionC++ 指针转换
【发布时间】:2014-04-02 08:46:58
【问题描述】:

我是 C++ 编程新手,所以这个问题可能很基础,但这里是:

我有四个类 - A、B、C 和 D。它们的关系定义如下:

class B : public A;
class D : public C;

A 是一个抽象类(所有方法都是纯虚拟的)。 D 类实现了 C 没有的 Print() 函数。

//Class D - some code
void Print()
{
    //some code
}

A 类有一个 STL::list,它保存指向 C 类对象的指针。

//Class A - some code
protected:
    list<C*> myObjects;

在 B 类中,我有一个函数可以向 myObjects 推送指向 D 类型对象的指针(同样,D 继承了 C),它完美地工作。

Class B : public A
{
    // Some code
    D* obj = new D(...);
    myObjects.push_back(obj);
    return obj;
}

最后,在 B 类中,我有一个迭代 myObjects(继承自 A 类)的函数,如下所示:

for(list<C*>::iterator it = myObjects.begin(); it != myObjects.end(); it++)
{
    //I wish to call the function D.Print() but I get an error!
    D *a = *it;
    a->Print();
}

错误状态:

error C2440: 'initializing': cannot convert from 'std::_List_iterator<_Mylist>' to 'D*'

我的印象是,如果“a”是一个指向 D 类对象的指针,那么如果我给它一个迭代器引用的指针的值(它指向一个指向类型对象的指针D) 我可以调用 Print()。

你能帮忙吗? 提前致谢!

【问题讨论】:

  • @juanchopanza 我试过了,但由于 Print 没有在 C 类中定义,我得到 C2039: 'Print' : is not a member of C.
  • 对不起,我错过了那部分。然后你需要尝试dynamic_cast。最好在代码中包含相关信息,而不是散文。
  • 不只是试图解释你所拥有的,用小的脱离上下文的代码sn-ps,为什么不创建一个Minimal, Complete, and Verifiable example你可以给我们看呢?这将使您更容易理解您拥有什么以及可能发生的事情。
  • 我会在接下来的问题中记住这一点。感谢您的提示。

标签: c++ pointers casting


【解决方案1】:

如果您定义,则无需尝试转换为 D 类型

virtual void Print() = 0;

在课堂上C

然后你可以通过编写来利用多态性

C *a = *it;
C->Print();

或者,甚至更好,

(*it)->Print();

如果您不能这样做,那么您可以使用dynamic_cast,或者直接存储list&lt;D*&gt; myObjects;

【讨论】:

  • 显然:“D 类实现了 C 没有的 Print() 函数。”
  • @jsantander:哎呀。忘记阅读规范。不会是最后一次;-)
  • 我添加了 virtual Print() = 0 并且确实问题解决了!如果不允许 changinc C 的 API 怎么办?
  • 如果你不能改变C的API但是可以改变类A,那么我会把列表重新定义为list&lt;D*&gt;。使用dynamic_cast 作为最后的手段。
【解决方案2】:

试试

D *a=dynamic_cast<D *>(*it)

列表的内容可能是 D 对象,但这仅在运行时知道,因此编译器无法在编译时知道列表是否包含 D 对象或其他 C 派生类。

为了记录,这段代码编译在ideone

【讨论】:

  • 我收到错误 C2683: 'dynamic_cast' : C is not a polymorphic type
  • @Tal 你说 C 有虚方法...用 g++ 尝试了一个虚拟示例,它工作正常。
  • 我错了。 A是抽象的。 C 不是。很抱歉造成混淆 - 我编辑了原始问题。
  • 然后使用 static_cast 代替......但是,取决于你如何处理事情......你可能需要在 C 上使用虚拟析构函数
  • 这可能是相关的:(stackoverflow.com/questions/332030/…)
【解决方案3】:

确保PrintC 中声明为纯虚拟,然后在打印循环中使用C 指针而不是D。您不需要任何强制转换,这就是虚函数的用途。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-24
    • 2021-06-06
    • 2021-09-20
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    相关资源
    最近更新 更多