web-dev-qa-db-ja.com

「this」引数の型はconstですが、関数はconstとしてマークされていません

わかりましたので、私はC++で少し慣れており、2回目の割り当てでは、パブリック引数やプライベート引数などを使用してクラスを作成する必要があります。

これはクラスのヘッダーファイルです。

class Customer {

private:
    string PhoneNumber_;
    string Name_;
    string Address_;

public:
    string get_PhoneNumber() const {return PhoneNumber_;} // Accessor
    const void set_PhoneNumber(unsigned x) {PhoneNumber_ = x;} // Mutator

    string get_Name() const {return Name_;}
    const void set_Name(unsigned x) {Name_ = x;}

    string get_Address() const {return Address_;}
    const void set_Address(unsigned x)  {Address_ = x;}
};

// declare the CreateCustomer function prototype with default values
Customer* CreateCustomer(const string& id = BLANK, const string& name = BLANK, const string& address = BLANK);

Customer* CreateCustomer(const string& id, const string& name, const string& address) {
    Customer* temp = new Customer();

    temp->get_PhoneNumber() = id; // Due to the Accessors and Mutators PhoneNumber, Name and Address are now functions
    temp->get_Name() = name;
    temp->get_Address() = address;

    return temp;
}

そして、これは私がmain.cppファイルで得るエラーです:

cout << "\n\nDear ";
    cout << Charge[0].Holder.set_Name() << " (" << Charge[0].Holder.set_PhoneNumber() << ")";  //  DisplayCustomer(customer) ;

    cout << ",\n" << Charge[0].Holder.set_Address() << "\n\n"

基本的に、正確なエラーメッセージは次のとおりです。

メンバー関数 'set_Name'は実行不可: 'this'引数の型は 'const Customer'ですが、関数はconst型ではありません

Set_PhoneNumberとset_Addressでも発生します。どんな助けも大歓迎です!ありがとう!

PDATE:動作しました。手伝ってくれてありがとう!

15
Liam George

値を設定する場合は、setメソッドを使用します。 getメソッドは変数を取得するためだけであり、クラスの内部変数を設定するためではありません(それらがあなたのやり方で定義されている場合)。

正しい使用法は次のとおりです。

Customer* CreateCustomer(const string& id, const string& name, const string& address) {
    Customer* temp = new Customer();

    temp->set_PhoneNumber( id );
    temp->set_Name( name );
    temp->set_Address( address );

    return temp;
}

また、メソッドのインターフェースを変更する必要があります。

class Customer {

private:
    string PhoneNumber_;
    string Name_;
    string Address_;

public:
    string get_PhoneNumber() const {return PhoneNumber_;} // Accessor
    void set_PhoneNumber(const string& x) {PhoneNumber_ = x;} // Mutator

    string get_Name() const {return Name_;}
    void set_Name(const string& x) {Name_ = x;}

    string get_Address() const {return Address_;}
    void set_Address(const string& x)  {Address_ = x;}
};

数字ではなく文字列を設定したいので。

const string&を関数の引数として使用することは、引数として渡すときに文字列をコピーしないように、文字列よりも優れています。 const参照であるため、関数が入力を操作することを恐れる必要はありません。

5
Gombat
  1. クラス宣言では_std::_を使用する必要があります。 なぜ「名前空間stdを使用する」が悪い習慣と見なされるのか? を参照してください。

  2. _set__メソッドはunsigned引数を取ります。 _PhoneNumber_ = x;_のような文字列に符号なしを割り当てることはできません。引数は文字列である必要があります。

次のようにメンバーを変更する必要があります

_std::string get_PhoneNumber() const { return PhoneNumber_; } // Accessor
const void set_PhoneNumber(std::string const & x) { PhoneNumber_ = x; } // Mutator
_
  1. temp->get_PhoneNumber() = id;を書くとき、意図は明らかに_PhoneNumber__の値をsetにすることなので、なぜget _メソッド?適切なset _メソッドを使用して、temp->set_PhoneNumber(id);と記述するだけです。

  2. 一般に、C++ではポインターを避けます。本当にポインターが必要な場合は、_std::unique_ptr_や_std::shared_ptr_などのスマートポインターを使用します(プレーンポインターを使用する必要がある場合にのみ使用します)。

  3. _std::string_の 'blank'デフォルト値は、次のような空の文字列です

    _std::string const & id = std::string{}_はっきりと見えます。

  4. Customer型のオブジェクトを空白/空のメンバー文字列で作成するには、_Customer customer_object;_デフォルトコンストラクターを使用する暗黙的に宣言されたデフォルトコンストラクターがあるため、_std::string_以上の操作を行う必要はありません。とにかく空のストリンガンになります。

  5. 通常、constructorは、いくつかの引数値に応じてオブジェクトを作成するために使用されます。

すべての必要な値を取り、とにかくデフォルトの構成として使用できるものを簡単に書くことができます。

_Customer(const std::string& id = std::string{}, 
  const std::string& name = std::string{}, 
  const std::string& address = std::string{})
  : PhoneNumber_(id), Name_(name), Address_(address)
{ }
_

あなたのクラスに。別の C++クラス初期化リストの例 を参照してください。

別の C++クラス初期化リストの例 を参照してください。

  1. カプセル化のために、通常、 'direct'ゲッターとセッターを使用してデータ構造を明らかにすることは避けたいです。
2
Pixelchemist

えーgetsetを逆の方法で使用する必要があると思います... CreateCustomerでは、set関数を使用し、Customerを印刷するときにストリーミングするには-get関数を使用する必要があります。また、set関数は、stringではなく、unsignedを受け取る必要があります。

そのため、constructor関数の代わりにsetを使用し、get関数のみを使用する方が適切です。

1
ForEveR

_PhoneNumber__、_Name__、および_Address__をstringとして宣言しました。
しかし、setterメソッドでは、unsigned (int)を渡します

また、ゲッターとセッターの使用を逆にしました!

また、セッターの戻り値の型は、_const void_ではなく、voidだけにすることができます。

0
CinCout