[更新]我正在努力使用抽象类,这是我的代码(简单模型):

class A{
  public:
    virtual ~A(void){};
    virtual void print() const = 0;
};

class B : public A{
  public:
    void print() const{cout << x << endl;}
  private:
    int x;
};

class C : public A{
  public:
    void print() const{cout << x << endl;}
  private:
    double x;
};

class X{
  public:
    X(void){
      array = new A * [20]; 
    }
    void Add(const A & src){
      array[someindex] = &src; //Fpermissive, cannot convert const A * to A *
    }; 
  private:
    A ** array; 
};

int main(int argc, char const *argv[]){
  X obj;
  obj.Add(B(9)); //B.x = 9
  obj.Add(C(3.3333)); // C.x = 3.3333

  return 0;
}

如何在X的数组中存储B和C? 如何使src为非常量? 可能吗? 感谢您的回复。 而且我无法修改main。 我不想为类B或C的参数添加方法...

好的,目标是,我必须将对象BC存储在X而我却不能修改main函数。 BC对象具有非常相似的方法。

===============>>#1 票数:1 已采纳

如何在X的数组中存储B和C?

你不能 仅在分配了空间来存储它们之后,才可以存储指向它们的指针。

如何使src为非常量?

大概是因为您传入了临时变量,因此“被迫”将const添加到X :: Add()的参数声明中。 您需要传递l值的地址。

void X::Add( A *src ) { array[someindex] = src; }

B   b(9);
X.Add( &b );
C   c(3.3333);
X.Add( &c ); 

可能吗?

是的,使用const_cast<> ,但是在这种情况下,这将是灾难的根源。 您的根本问题是您尝试存储临时地址。 当您执行以下操作时:

X.Add(B(9)); // B will be destroyed when the execution of this statement ends.

假设您找到了一种实现方法,那么最终将存储在数组中的内容将是指向垃圾的指针。

更新:基于注释中的交换,看来您需要保存传递​​给X::Add()方法的const A& src项的副本。 通过基类引用或指针进行复制需要一个虚拟的“ clone()”方法,其特定目的是在运行时调用子类实现。

class A {
...
virtual A* clone() const = 0;
...
};

class B : public A {
...
// Note signature: this works due to return type covariance
B* clone() const { return new B(*this); } 
...
};
// similarly for class C and others

// use it like this
class X {
...
void Add(const A & src){ array[someindex] = src.clone(); }
...
};

当然,完成后,您将必须释放这些对象。

===============>>#2 票数:0

创建obj时,**只是一个指向任何地方的模糊指针,因为您需要对其进行初始化。 您可以使用共享的指针和向量,这将允许您存储对对象的引用并避免处理删除

你可以这样声明X

class X{
  public:
    void Add(const shared_ptr<A> & src){ array.push_back(src); };
  private:
    vector<shared_ptr<A>> array; 
};

这将允许任意数量的对象存储到数组中,并避免处理数组,这更简单

你可以这样使用

int main(int argc, char const *argv[]){
  X obj;
  shared_ptr<B> shrdB(new B(9));
  shared_ptr<C> shrdC(new C(3.3333));
  obj.Add(std::dynamic_pointer_cast<A>(shrdB));
  obj.Add(std::dynamic_pointer_cast<A>(shrdC));
  return 0;
}

  ask by marthin23 translate from so

未解决问题?本站智能推荐:

关注微信公众号