指向类的指针数组

C++ - Array of pointers to classes

本文关键字:指针 数组      更新时间:2023-10-16

我希望这里有人能帮助我。

所以这是我的问题:我有一个主班和三个其他班。现在我要创建一个数组每个索引都指向其中一个类。我知道如何用这样一个类来实现它:

Class1* array[10];

然后我可以对每个索引使用这个:

array[i] = new Class1;

但是有可能声明一个数组,然后使用这样的东西吗?

array[0] = new Class1;
array[1] = new Class2;
array[2] = new Class3;

向Synotix致以亲切的问候

是的,你可以这样做但是为了达到这个目的,你必须在c++中使用继承和多态性。

你能做的是。创建一个父类,即

Class parent {
// Some common code here
// Some virtual function here
}

然后继承你所有的类,就像在你的例子中,Class1, Class2, Class3from parent类。还可以在父类中创建虚方法,以在c++中获得多态性。

用这种方法你就能做这件事了。

parent * allClasses[10];
allClasses[1]= new Class1();
allClasses[2]= new Class2();
allClasses[3]= new Class3();

这是你想要的一个完整的例子。点击此链接有人能解释一下多态性的好处吗?

如果你使用一个主类作为父类,并且Class1, Class2 and Class3类应该是主类的子类,这是可能的。

如果你所有的类(1-3)extend从类,例如ParentClass你可以写:

ParentClass* array[n];
ParentClass* class1 = new Class1();
ParentClass* class2 = new Class2();
ParentClass* class3 = new Class3();
//...
array[0] = class1;
//... classes 2 and 3

下面是一个如何在c++中扩展类的示例。

这是可能的,但是你想对数组做什么?如果你的所有类都有一个共同的基类,那么你可以定义你的数组来包含指向该基类的指针,然后你可以像你所做的那样向数组中添加类。

为了使用你的类,你需要在基类上通过virtual方法来实现。

一些建议:我建议你的基类有一个virtual析构函数,这意味着当你对数组的元素进行delete时,它将调用派生类的析构函数。另外,我建议使用智能指针代替原始指针,这样你就不需要调用delete。下面是一个例子,我使用vector代替数组和类模板来定义类:
#include <memory>
#include <vector>
#include <iostream>
class MyBase {
 public:
  virtual ~MyBase() {}
  virtual void hello() = 0;
};
template<int N>
class MyClass : public MyBase {
 public:
  virtual void hello(){ std::cout << "Hello, I am Number" << N << std::endl; }
};
int main() {
  std::vector<std::unique_ptr<MyBase>> my_classes;
  my_classes.emplace_back(new MyClass<1>());
  my_classes.emplace_back(new MyClass<2>());
  my_classes.emplace_back(new MyClass<3>());
  for(auto& my_class : my_classes)
    my_class->hello();
}