0

ISBN、注文の 2 つのクラスがあります。Order クラスのデータ メンバーとして ISBN オブジェクトがあり、ISBN オブジェクトを安全な空の状態にするための Order コンストラクターに問題があります。

私の注文.h

#include <iostream>
using namespace std;

class ISBN;

class Order {

int ordered;
int delivered;
ISBN * book;
bool empty;

public:

Order();
Order(const ISBN & isbn);


};

私のISBN.h

#include <iostream>
using namespace std;

class ISBNPrefix;

class ISBN {

char isbnNum[13];
char area[6];
char publisher[8];
char title[7];
char checkDigit[1];
bool emptycheck;
bool registered;

public:

ISBN();
ISBN(const char * str, const ISBNPrefix& list);
}

Order コンストラクターで、次のコードを試しました。

Order::Order() {

ordered = 0;
delivered = 0;
empty = true;

*book->ISBN();

/*
(*book).isbnNum[0] = '\0';
book.area[0] = '\0';
book.publisher[0] = '\0';
book.title[0] = '\0';
book.checkDigit[0] = '\0';
book.emptycheck = true;
book.registered = false; */
}   

そしてそれのバリエーションですが、「型名は許可されていません」「式にはポインター型が必要です」などのエラーが表示されます...誰か私の問題が何であるか知っていますか?

4

2 に答える 2

2

ほとんどの場合、ここではポインターは必要なくISBN、データ メンバーとしてのオブジェクトだけが必要です。

ISBN book;

これは、デフォルトのコンストラクターを使用して自動的に初期化されます。何もする必要はありません。他のコンストラクター (引数付き) を使用して初期化する場合は、初期化リストでそれを行う必要があります。

Order::Order() : book(some_string, some_list)
{
    // body of constructor
}
于 2013-03-22T16:42:40.097 に答える
1

として宣言bookしたため、問題が発生していますISBN*。したがって、投稿された行*book->ISBN();は null を逆参照してから、空のコンストラクターを呼び出そうとしています。

を手動で割り当てたい場合bookは、次のパターンを使用する必要があります。

Order::Order() {

    ordered = 0;
    delivered = 0;
    empty = true;
    book = new ISBN();
}   

これには、のデストラクタがそのメンバーOrderに対して delete を呼び出す必要があることに注意してください。book

ポインタではなくクラス メンバにすることで、bookとして自動的に割り当てと削除を行うことができます。ISBNそのためには、次の宣言を使用します。

class Order {

    ISBN book;
    ... // your other members
}

これにより、クラスがそれぞれインスタンス化および破棄さISBNれるたびに、オブジェクトメンバーが自動的に割り当てられ、自動的に割り当て解除されます。Order追加の手順は必要ありません。

于 2013-03-22T16:53:12.803 に答える