0

セッターが2人いるクラスがあります。1つは、パラメーターが一定で、もう1つはそうではありません。

class  Author
{
  string name;
  Book* book;
public:
  void setName(const string& name) { this->name = name; }  // no error
  void setBook(const Book* book) { this->book = book; } // error: value of const Book* cannot assign to Book*
}

私の質問は、なぜsetNameメソッドで、エラーなしでパラメーターを定数にすることができるのに、ではできないのかということsetBookです。

ありがとう :)

4

3 に答える 3

4

*bookに割り当てた後、オブジェクトポイントを変更できるため、引数の性質this->bookを回避できます。const

(非constオブジェクトへのポインターに明示的にキャストする必要があります)

言い換えると、

  • 宣言setBook(const Book* book)は、が指すオブジェクトbookが変更されないことを意味します(これは、呼び出し元の関数に対する「約束」です)。
  • ただし、フィールドthis->bookは、それが指すオブジェクトを簡単に変更できるように宣言されています。

this->book関数の引数からの割り当てにより、book後で関数の引数が最初に指しているオブジェクトを変更できるようになりますbook

于 2012-11-25T15:27:21.413 に答える
2

const Book*Bookへの(constポインタ)ではなく、(const Book)へのポインタです。(私はあなたが後で期待したと思います)。

このようなエラーを回避するには、typedefedポインタ型を使用する必要があります。windows.hでどのように行われるかを見てください。

typedef ULONG *PULONG;

このように混乱はありません。私のアドバイス:typedef Book *PBook;クラスBook宣言の直後に記述し、実際のコードに「Book*」と入力することは決してありません。

于 2012-11-25T15:33:00.667 に答える
1

あなたがそれを行うことができたとしたら、あなたは次のようなコードを書くことができます:

// definition of Book
struct Book {
    int pages;
}

// inside Author, member function
void setBook(const Book* abook) { 
    this->book = abook;
    this->book->pages = 1; // modify the object pointed to by abook
}

// calling code that uses Author class
const Book b = {0}; // a const object
myAuthor->setBook(&b); // modifies a const object

constシステムのポイントは、コードにキャスト(constを削除する)が含まれていない限り、constオブジェクトを変更できないようにすることです。したがって、pointer-to-const型の値を、型がpointer-to-non-constである変数に割り当てることは禁止されています。

于 2012-11-25T16:08:31.867 に答える