0

クラス baseclass のオブジェクトがあるとします。

// baseclass.h
class baseclass
{
    baseclass() # default constructor, constructs baseclass object
}

そして、ベースクラスの .cpp で:

// baseclass.cpp
baseclass::baseclass()
{
    // member functions and variables
}

ここでの目標は、派生クラスを作成し、派生クラスの既定のコンストラクターで、静的なサイズnの基本クラス オブジェクトの配列を作成することです。明確にするために、これを考える別の方法は、ベースクラスをトランプとして考えることです。派生クラスでデフォルトのコンストラクターを呼び出して、これらのカードの配列 (デッキ) を作成したいと考えています。ただし、質問の範囲を抽象化しておくことにしたので、ベース/派生を引き続き使用して、他の人がこれがどのように適用されるかをより簡単に確認できるようにします。

これをオブジェクト指向の方法で設定する最善の方法がわかりません。これまでのところ、このようなものがありますが、セグメンテーション違反が発生しています。設定方法は次のとおりです。

// derivedclass.h (extending baseclass)
class derivedclass
{
    // default constructor for derivedclass object
    derivedclass();

    // a pointer to an object of type baseclass
    baseclass* bar;
    // or should it be:
    baseclass* bar[n] // where n is an integer
    // or is there a better way to do it?
}

最後に、派生クラス オブジェクトは配列を持つことができると述べたので、派生クラスの .cpp の既定のコンストラクターに対してそれを真にする必要があります。

// derivedclass.cpp
derivedclass::derivedclass()
{
    // so I need to initialize the member array
    baseclass* bar = new baseclass[n] // where n is the size I want to initialize 
                                      // the array to
}

それでは、私がリストした状況のいずれかがセグメンテーション違反を引き起こすでしょうか? このオブジェクトの配列を作成する最良の方法は何ですか? これが初心者の質問である場合は申し訳ありません。私はまだメモリ割り当てとポインターについて多くを学んでいる学生であり、通常はこれについて心配する必要のない言語を扱っています。また、他の人の利益のために、質問を抽象的に保つように努めました。前もって感謝します!

4

3 に答える 3

3

ここで動的割り当てを使用する必要がある理由がわかりません。私はむしろこのようなことをしたいと思います。これにより、derivedclassのコンストラクターでの作業も節約できます。

struct baseclass
{
    // Stuff...
};

struct derivedclass : baseclass
{
    // Stuff...

    baseclass objects[N];
};

C++11std::array<>では、プレーンな C スタイルの配列の代わりに使用する必要があります (C スタイルの配列std::array<>の安全なゼロ オーバーヘッド ラッパーです)。

// ...

#include <array>

struct derivedclass : baseclass
{
    // Stuff...

    std::array<baseclass, 10> objects;
};
于 2013-03-28T19:36:49.360 に答える
1

なぜ使用newするのですか?カードからデッキを派生させる理由 デッキにはカードが含まれています。

 class Card
 {
     // ... whatever card does
 };

 class Deck
 {
 public:
     static int const CountOfCards = 36;
     typedef std::array<Card,CountOfCards> Cards;
     Cards cards;
     // etc. ... whatever deck does
 };
于 2013-03-28T19:41:22.237 に答える
1
// so I need to initialize the member array
baseclass *bar = new baseclass[n];

これを除いて、メンバー配列を初期化せず、メンバー変数と同じ名前のローカル変数のみを初期化するため、それをシャドウします(同じ理由で、ポインターを失うことでメモリリークも発生します)new直接割り当てられた配列に) 。

于 2013-03-28T19:35:54.617 に答える