【问题标题】:How can I store address of dynamically created objects in C++?如何在 C++ 中存储动态创建的对象的地址?
【发布时间】:2020-10-20 02:22:52
【问题描述】:
class A 
{
public:
    virtual void show()
    {
        cout << "you are in A";
    }
};

class B : public A
{
public:
    void show()
    {
        cout << "you are in B";
    }
};

int main()
{
    A *a[5];
    A **aa[5];
    B *b[5];

    for (int i = 0; i < 5; i++)
    {
        a[i] = new A;
        aa[i] = &a[i];
        aa[i]->show();
        b[i] = new B;
        aa[i] = &b[i];
        aa[i]->show();
    }

    return 0;
}

错误 : 请求成员'show' in *aa[i] which of type pointer 'A*'

错误:从 'B**' 到 'A**' 的无效转换 [-fpermisive]

【问题讨论】:

  • 错误信息是什么?
  • 考虑创建一个minimal reproducible example 而不是像//INSIDE MAIN 这样的cmets。帮助我们帮助您。
  • 欢迎来到 Stack Overflow。请阅读the help pages,接受SO tour,阅读How to Ask,以及this question checklist。最后请学习如何edit你的问题来改进它,比如向我们展示你得到的错误的完整复制粘贴。实际上是在问一个问题。
  • 错误:在 *aa[i] 中请求成员 'show' 类型指针 'A *'
  • 错误:从 'B**' 到 'A **' 的无效转换 [-fpermisive]

标签: c++ class pointers dynamic-memory-allocation virtual-functions


【解决方案1】:

由于你有A **aa[5],它是一个指向指针的数组,所以你需要三重间接调用show方法

(*aa[i])->show();

您也不能在其中存储B**,因为您只能(隐式)转换为具有单级间接性的基类。

但是,完全不清楚您要做什么。更常见的是,您只需要使用一个指针数组并且只需要双重间接:

A *a[5];
for (i = 0; i < 5; ++i)
    if (i & 1)
        a[i] = new A;
    else
        a[i] = new B;
for (i = 0; i < 5; ++i)
    a[i]->show();

很少需要双指针,那你为什么要使用它们呢?

【讨论】:

  • 感谢您的帮助,但我的第二个错误仍然存​​在 error : invalid conversion from 'B**' to 'A**' [-fpermisive]
  • 是的,因为你不能转换为具有多个间接的基类——这样做是没有意义的(而且通常是不安全的),所以编译器不会让你来做。
  • 我正在使用虚函数,那么如何在动态内存分配的情况下从基类A的指针调用B类的show()?
  • @AnmolSingh:这就是虚函数的工作方式——它们根据对象的动态(实际)类型调用,而不是指针的类型。
猜你喜欢
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-13
  • 2014-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多