【问题标题】:Resizing array of pointers on objects with the same base class在具有相同基类的对象上调整指针数组的大小
【发布时间】:2011-12-18 00:07:44
【问题描述】:

我在 C++ 中有一个问题,我找不到答案。 我有一些课程:

class Xyz{
   //...
};
class MyClass1: public Xyz{
   //...
};
class MyClass2: public Xyz{
   //...
};
class MyClass3: public Xyz{
   //...
};

如您所见,MyClass1、MyClass2 和 MyClass3 具有相同的基类。现在我想定义一些对象:

MyClass1 *object1 = new MyClass1();
MyClass2 *object2 = new MyClass2();
MyClass3 *object3 = new MyClass3();

之后,我想创建一个动态数组,其中包含指向这些对象的指针(据我所知这是可能的)和一个保存该数组中元素数量的整数。我将该数组命名为 someName,以后它应该存储 object1、object2 和 object3。

Xyz **someName;
int numberOfElements = 0;

问题从这里开始。 someName 是空的,所以我想在其中添加一些内容。但我不知道如何使用给定数量的指针创建一个新数组,以将旧元素复制到其中。这当然行不通:

Xyz **someNameTemp = new Xyz[numberOfElements+1];

知道调整大小功能的外观吗? 感谢您的帮助。

【问题讨论】:

  • ¤ 你没有数组。声明“someName 为空”是错误的。因此,谈论调整大小是没有意义的。这声明并初始化了一个合适的数组:Xyz* array[] = {object1, object2, object3};。它无法调整大小。顺便说一句,无论谁宣布标准库对您来说都是禁区,他都不是这门学科的好老师。考虑自学。干杯&hth.,
  • 但是创建一个新的临时数组,重写所有对象然后切换指针怎么样?
  • @AlfP.Steinbach,我不同意 - 了解基础知识和 STL 都很重要。 学习一个或另一个不是一个好主意,但最终你必须先学习一个,然后先学习基础知识是一个非常好的主意。
  • @bdonlan:你有很多东西要学。你说先学习基础知识是个好主意,这在本质上没有任何错误,但这种说法与以合理的速度学习并且没有不合理的斗争相冲突。但是,正如您可能了解到的那样,不使用标准库与此相冲突。无论如何,不​​要相信我的话。给自己买一本好书(这不会让你不必要地纠结于细节),例如Koenig & Moo 的“Accelerated C++”,或在 SO 上查看 C++ 书籍列表常见问题解答。干杯&hth.,

标签: c++ arrays pointers dynamic


【解决方案1】:

您可以避免所有麻烦,只需使用std::vector

std::vector<Xyz *> pointers;

pointers.push_back(new MyClass1());
pointers.push_back(new MyClass2());
// etc.

[旁注:您应该强烈考虑使用原始指针;而是使用智能指针,因为它使资源管理更加简单。]

【讨论】:

    【解决方案2】:
    Xyz **someNameTemp = new Xyz*[numberOfElements+1];
    for (int i=0; i<numberOfElements; ++i)
        someNameTemp[i] = someName[i];
    delete [] someName;
    someName = someNameTemp;
    ++numberOfElements
    
    // someName[numberOfElements - 1] uninitialized
    

    另外,当你第一次创建指针时,一定要初始化它。要么是 NULL,要么是分配的数组。

    【讨论】:

    • 以这种方式进行(添加新元素)产生平方时间,O(n^2)。教初学者这种不切实际的技术不是一个好主意。这就像教新手司机通过拆卸油箱来给汽车加油:是的,这在技术上是可行的,但是。
    猜你喜欢
    • 2016-03-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多