0
  • AとBの2つのクラスがあります
  • クラスBには、オブジェクトAの一定の動的サイズの配列であるプライベートメンバー変数があります。
  • クラスBのコンストラクターの1つは、クラスBの配列を設定するために使用されるクラスAオブジェクトへの定数参照を取ります。

クラスB:

class B
{
  private:
    const A** theArray;
  public:
    B(const A&);
};

B::B(const A& newA)
  : theArray(newA) //<-- ??
{
}

プログラムをコンパイルしようとすると、「'constA'から'constA**'に変換できません」というエラーが表示されます。

オブジェクトをメンバー初期化リストに渡して、それらから配列を作成するにはどうすればよいですか?

編集1:これはcomsciクラスの割り当て用です。現在クラスについて学習しており、この割り当てでは、この特定のクラスに対して3つの別個のコンストラクター(コピーコンストラクター、クラスBの「theArray」に新しいAオブジェクトを追加するコンストラクター、および最初のAオブジェクトを追加するコンストラクター)を作成します。 'theArray'に(これは問題のコンストラクターです)。

リストの3番目のコンストラクターを呼び出して、オブジェクトを作成するという考え方です。次に、別のAオブジェクトを配列に追加する場合は、2番目のコンストラクターを呼び出します。次に、オブジェクトのコピーが必要な場合は、コピーコンストラクターを使用します。

4

4 に答える 4

1

これは、C++で動的なサイズの配列を指定する方法ではありません。クラスBは次のようになります。

class B
{
    std::vector<A> const theArray;
public:
    B( A const& initialA )
        : theArray( n, initialA )
    {
    }
};

これにより、n(配列内の要素の数)がどこから来ているのか、そしてなぜ地球上ですべての要素が同じで不変の配列を作成したいのかという疑問が残ります。

実際、私はあなたがあなたがやろうとしていることを正確に説明しているのではないかと疑っています。A実際、(実際の Aオブジェクトは別の場所にあり、オブジェクトの一部ではない)へのポインターの配列が必要B ですか?そして、Aオブジェクトを使用しますconst(ただし、配列ではありません。「一定の動的サイズの配列」は撞着語です)。その場合:

class B
{
    std::vector<A const*> theArray;
public:
    B( A const& initialEntry )
        : theArray( 1, &initialEntry )
    {
    }
};

その後、他のエントリを後で追加できます(常にタイプA const*)。

于 2012-10-01T07:55:35.917 に答える
1

プログラムをコンパイルしようとすると、「'constA'から'constA**'に変換できません」というエラーが表示されます。

次に、最初に行う必要があるのは、コンパイラエラーを理解することです。コンパイラを何と言おうとしていますか?

Bコンストラクターでは、型const A **の指定されたパラメーターを使用して型のメンバーを初期化しますconst A &。それらは同じタイプではなく、これがコンパイラが文句を言う理由です。

それで、それを修正するために何をすべきですか?

Bコンストラクターを作成して、引数と同じタイプのメンバー変数を取得する必要があります。

class B
{
private:
    const A** theArray;
public:
    B(const A**);
};

B::B(const A** newA)
    : theArray(newA) //<-- They're of the same type: no problem.
{
}

ただし、クラス外の呼び出しがコンストラクター定義と一致することを確認する必要があります。

しかし、その代わりに、デザインを修正することをお勧めします。裸のポインターが問題の唯一の解決策であると確信していますか?を改善するには、この質問に答える必要がありますclass B

  • 動的メモリが作成される場所と破棄される場所はどこですか?
  • class B与えられたの所有権を取りA**ますか?

class Bが動的メモリの所有者になる場合は、外部ではなくtheArray内部class B自体を作成および破棄することを検討する必要があります。

が動的メモリの所有者にならない場合はclass B、メモリに十分注意する必要があります。が指すメモリは、 ?theArrayの前に破棄されます。class B言い換えれば、すでに削除class Bされたによってポイントされたメモリを持つインスタンスである可能性がありますか?theArrayこの場合、スマートポインタが役立つ可能性があります。

于 2012-10-01T08:13:11.713 に答える
0

ポインタの配列にメモリを割り当てていません。

また、コンストラクターには、参照ではなくAのポインターを渡す必要があります。

于 2012-10-01T08:01:23.007 に答える
0

もちろんstd::vector<int>望ましいです-それを使用する方法については他の回答を参照してください。 本当に動的配列を使用したい場合は、デストラクタを追加し、コピー/移動することを忘れないでください。

また、に渡されるAオブジェクトが何であるかを知る必要があることを忘れないでくださいB(const A&)。一時的なものにすることはできません。このnewAは、Bオブジェクトと同じ長さである必要があります。それが動的である場合(newによって作成された場合)-どのオブジェクトがそれを削除する責任があるかを知っている必要があります。クラスBなのか?

とにかく、直接の答えを示すためだけに:

{}C ++ 11では、次の場合と同じように、新しい初期化構文を使用すると非常に簡単です。std::vector

class B
{
  private:
    const A** theArray;
  public:
    B(const A&);
};

B::B(const A& newA)
  : theArray(new const A*[some_size] { &newA } ) //<-- ??
{}

C ++ 03では、動的配列を作成/初期化するために追加の静的メソッドが必要です。

class B
{
  private:
    const A** theArray;
    static const A** makeArray(const A& a)
    {
       const A** rv = new const A*[some_size]();
       rv[0] = a;
       return rv;
    }
  public:
    B(const A&);
};

B::B(const A& newA)
  : theArray(makeArray(newA))  //<-- ??
{}
于 2012-10-01T10:34:24.313 に答える