0

私はいくつかのパブリックメンバー関数とプライベート変数を持つかなり標準的なクラスを持っています。

私の問題は元々、クラスのオブジェクトインスタンスに動的に名前を付けることができないことに起因しているため、クラスタイプのポインターの配列を作成しました。

static CShape* shapeDB[dbSize];

コンストラクターに渡されるフィールドの情報を取得するためのプロンプトがいくつかあります(これは機能しているようです):

shapeDB[CShape::openSlot] = new CShape(iParam1,sParam1,sParam2);

openSlotは適切にインクリメントするため、別のCShapeオブジェクトを作成すると、次のポインターがそれを指すようになります。この次のコードは機能せず、一貫してクラッシュします。

cout << shapeDB[2]->getName() << " has a surface area of: " << shapeDB[2]->getSA() << shapeDB[2]->getUnits() << endl;

ポインタの配列はmainの外部でグローバルに宣言され、get()関数は文字列または整数を返すクラス内でパブリックになります。何が間違っているのかわかりませんが、ポインタの設定に関連する何かがあると確信しています。私はこのコードを書いているのは、クラス/ポインターについてもっと学ぶためですが、これを行おうとしている人が他に見つからないため、ひどく困惑しています。

また、CShapeの新しいインスタンスの名前も知りたいです。オブジェクトインスタンスを動的に作成し、メンバー関数のためにそれらにアクセスできるように名前を追跡する他の方法があれば、私はすべての耳です。

ポインタ参照/逆参照のあらゆる種類の順列を試しましたが、ほとんどがコンパイルできません。誰かがそれが役立つと思うなら、私はより大きなチャンクまたはすべてのコードを投稿することができます。

class CShape {
    int dim[maxFaces];
    int faces;
    string units;
    string type;
    string name;
    bool initialized;
    int slot;
public:
    static int openSlot;

    CShape();
    CShape(int, string, string); // faces, units, name
    ~CShape();

    void initialize(void);

    // external assist functions
    int getA(void) {
        return 0;
    }
    int getSA(void) {
        int tempSA = 0;

        // initialize if not
        if(initialized == false) {
            initialize();
        }

        // if initialized, calculate SA
        if(initialized == true) {
            for(int i = 0; i < faces; i++)
            {
                tempSA += dim[i];
            }
            return(tempSA);
        }

        return 0;
    }
    string getUnits(void) {
        return(units);
    }
    string getName(void) {
        return(name);
    }

    // friend functions
    friend int printDetails(string);
};

// constructor with values
CShape::CShape(int f, string u, string n) {

    initialized = false;
    faces = f;
    units = u;
    name = n;
    slot = openSlot;
    openSlot++;
}
4

1 に答える 1

2

私の推測では、CShapeコンストラクターを使用してCShape :: openSlotをインクリメントしますか?おそらく、読み取る前に値を変更しているため、ポインターは別の場所に格納されます。

このCShape::optionを除外するには、openSlotを固定値に置き換えてみてください。

-コードが追加されました-

これが問題であると確信しています。コンストラクターは割り当ての前に実行されます。つまり、lhsです。CShape::openSlotがインクリメントされた後に評価されます。

于 2013-01-16T21:10:34.957 に答える