0

単一の抽象クラスのすべての継承者であるさまざまな型のクラス標本を格納するコンテナーを正しく構築することに問題があります。レジスタ (コンテナー) は、抽象クラスの型を持つ、これらの標本の配列へのポインターを格納します。標本に含まれるデータにアクセスしようとすると、基本クラスにもある部分しか取得できません。たとえば、オーバーロードされた << は、3 つの継承子すべての要素を含むレジスタで使用され、抽象クラス部分のみを画面に書き込み、そこに存在しないものはすべて無視します。問題が正しく保存された要素の出力にあるのか、それとも不適切な形式で保存されているのかはわかりません。コードは次のとおりです。

class Register{
private:
int elementNum;
type * pData;
friend std::ostream &operator<<(std::ostream & os,const Register &v);
};
class type{
int a;
int b;
};
class type2: public type{
int c;
int d;
};

他の 2 つの継承者は、type2 と同じように動作します。ここにメインの一部があります:

    int main ()
    {
        type2 A1(1,2,3,4);
        type3 D1(4,5,6,7,8);
        type4 H1(9,10,11,12,13);
        std::cout<<A1<<D1<<H1<<endl;
        Register R1;
        R1.Add(0,A1);
        R1.Add(1,D1);
        R1.Add(2,H1);
        R1.Display();
        R1.MaxLength();
        std::cout<<R1;
        return 0;
    }

レジスタ上の演算子 <<:

std::ostream &operator<<(std::ostream & os,const Register &v){
    for(int i=0;i<v.elementNum;i++)
    {
        os<<v.pData[i]<<endl;
    }
    return os;
}

<< 演算子またはレジスタからの関数を使用するだけで、この問題は終了します。編集:追加機能の実装:

void Register::Add(int position,type& T){
    if(position<0||position>elementNum+1)
        return;
    type *pTemp = new type[elementNum+1];
    if(elementNum==0)
    {
        pTemp[0]=T;
        delete[]pData;
        pData=pTemp;
    }
    else
    {
        for(int i=0,j=0;j<elementNum+1;i++,j++)
        {
            if(position!=j)
                pTemp[j]=pData[i];
            else
            {
                i--;
                pTemp[j]=a;
            }
        }
        delete[]pData;
        pData=pTemp;
    }
    elementNum++;
}
4

2 に答える 2

1

基本クラスに共通のパブリック メンバー、または基本クラスから利用可能な仮想メソッドに、ポリモーフィックにのみアクセスできます。

さらに、ポインタ/参照を介してのみ仮想メソッドにアクセスでき、通常、.xml で行うように、異なるクラス インスタンスを連続して格納することはできませんpData

virtual std::ostream &type::dump(std::ostream &os)メンバー メソッドを作成し、オーバーライドがtype2などにある場合、各オーバーライド メソッドにそのサブタイプに固有のコンテンツを表示させることができます。

struct type {
  virtual ostream &dump(ostream &os) {
    os << a << " " << b << " ";
    return os;
  }
  int a;
  int b;
};

struct type2 : type {
  // Can use parent implementation AND use subtype-specific members:
  ostream &dump(ostream &os) override {
    type::dump(os);
    os << c << " " << d << " ";
    return os;
  }
  int c;
  int d;
};

// This class needs new "void Add(int pos, type &)" logic.
struct Register {
  int   elementNum;
  type *pData; // next hint: this is almost definitely not what you want.
  type **pda;  // probably better (need to use new/delete to make types)
};

ostream &operator<<(ostream &os, Register const &v) {
  for (int i = 0; i < v.elementNum; ++i) {
    // Calls proper virtual method for each instance.
    v.pData[i].dump(os); // XXX probably broken too
    v.pda[i]->dump(os); // should look more like this
    os << endl;
  }
}
于 2014-05-20T21:39:21.613 に答える