使用多个指针管理对象

问题描述 投票:0回答:1

假设我有两个抽象类,A1A2A1有一个叫做foo()的函数,A2有一个叫做bar()的函数。我创建了许多不同的这些基类的子类,比如C1,C2,C3,...,可能会也可能不会继承A1和/或A2.我现在想要遍历所有类型的A1和所有类型的A2并调用foo() resp bar()。我的问题是实现这一目标的最佳方法是什么?我的方法是使用智能指针或包含C1,C2,...实例的向量,即:

std::vector<C1> c1s;
std::vector<C2> c2s;
std::unique_ptr<C3> c3;
...

然后我声明了两个整数,n_A1n_A2,它们指定每个抽象类A1A2有多少个实例。然后我定义了两个指针数组:

A1 **a1s = new A1*[n_A1];
A2 **a2s = new A2*[n_A2];

然后手动将实例的所有地址添加到这些阵列。例如,如果c1s的长度为2,c2s的长度为3,如果C1继承A1C2继承A2C3继承A1A2,我会做:

a1s[0]=&c1s[0];
a1s[1]=&c1s[1];
a2s[0]=&c2s[0];
a2s[1]=&c2s[1];
a2s[2]=&c2s[2];
a1s[2]=c3.get();
a2s[3]=c3.get();

所以n_A1=3n_A2=4和我现在可以遍历地址数组a1s和a2s并调用函数foo()bar()。当删除包含所有这些对象的实例时,我只需要释放数组a1sa2s

不断建议不要在C ++中使用原始指针,我想知道这是否是解决这个问题的好方法?这种方法有风险吗?有没有更好的方法呢?

c++ oop pointers memory-management
1个回答
0
投票
class IA
{
   virtual ~IA();
}

class A1 :public  IA
{
   virtual ~A1();
   virtual void foo();
}

class A2 :public  IA
{
   virtual ~A2();
   virtual void bar();
}

class C1 :public  A1
{
   virtual ~C1();
   virtual void foo();
}
class C2 :public  A2
{
   virtual ~C2();
   virtual void bar();
}
class C3 :public A1,public A2
{
   virtual ~C3();
   virtual void foo();
   virtual void bar();
}

int main()
{
  std::vector<IA*> AllAsObjects;
  AllAsObjects.push_back(new C1());
  AllAsObjects.push_back(new C2());
  AllAsObjects.push_back(new C3());
  for (IA* Obj :AllAsObjects)
  {
    if(dynamic_cast<A1*>(Obj))
      dynamic_cast<A1*>(Obj)->foo();
    if(dynamic_cast<A2*>(Obj))
      dynamic_cast<A2*>(Obj)->bar();
  }
}

我想这就是你需要的

*请注意这是自编译的

© www.soinside.com 2019 - 2024. All rights reserved.