わかりましたので、私は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:動作しました。手伝ってくれてありがとう!
値を設定する場合は、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参照であるため、関数が入力を操作することを恐れる必要はありません。
クラス宣言では_std::
_を使用する必要があります。 なぜ「名前空間stdを使用する」が悪い習慣と見なされるのか? を参照してください。
_set_
_メソッドはunsigned
引数を取ります。 _PhoneNumber_ = x;
_のような文字列に符号なしを割り当てることはできません。引数は文字列である必要があります。
次のようにメンバーを変更する必要があります
_std::string get_PhoneNumber() const { return PhoneNumber_; } // Accessor
const void set_PhoneNumber(std::string const & x) { PhoneNumber_ = x; } // Mutator
_
temp->get_PhoneNumber() = id;
を書くとき、意図は明らかに_PhoneNumber_
_の値をsetにすることなので、なぜget _メソッド?適切なset _メソッドを使用して、temp->set_PhoneNumber(id);
と記述するだけです。
一般に、C++ではポインターを避けます。本当にポインターが必要な場合は、_std::unique_ptr
_や_std::shared_ptr
_などのスマートポインターを使用します(プレーンポインターを使用する必要がある場合にのみ使用します)。
_std::string
_の 'blank'デフォルト値は、次のような空の文字列です
_std::string const & id = std::string{}
_はっきりと見えます。
Customer
型のオブジェクトを空白/空のメンバー文字列で作成するには、_Customer customer_object;
_デフォルトコンストラクターを使用する暗黙的に宣言されたデフォルトコンストラクターがあるため、_std::string
_以上の操作を行う必要はありません。とにかく空のストリンガンになります。
通常、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++クラス初期化リストの例 を参照してください。
えーget
とset
を逆の方法で使用する必要があると思います... CreateCustomer
では、set
関数を使用し、Customer
を印刷するときにストリーミングするには-get
関数を使用する必要があります。また、set
関数は、string
ではなく、unsigned
を受け取る必要があります。
そのため、constructor
関数の代わりにset
を使用し、get
関数のみを使用する方が適切です。
_PhoneNumber_
_、_Name_
_、および_Address_
_をstring
として宣言しました。
しかし、setterメソッドでは、unsigned (int)
を渡します
また、ゲッターとセッターの使用を逆にしました!
また、セッターの戻り値の型は、_const void
_ではなく、void
だけにすることができます。