2015-09-11 17 views
3

好了,所以我現在有點在C++和我的第二個分配的小白,我需要做的類與公共和私營參數等等,等等基本上增變函數不起作用,因爲顯然它們不是const類型的?「這個」說法有const類型,但功能沒有被標記const的

這是頭文件與類:

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',但函數不是type cons t

它也發生在set_PhoneNumber和set_Address之上。任何幫助將不勝感激!謝謝!

更新:我得到它的工作。謝謝大家幫助我!

+4

返回類型是'const void'!? – Jarod42

+0

如果你想**設置**電話號碼**,CreateCustomer()應該調用'set_PhoneNumber(id)'。它的參數看起來應該是一個「字符串」而不是「無符號」。 – Galik

+1

你的錯誤信息是不言自明的。你不能在const對象上調用非const函數。但是,我看不到什麼是收費或持有人,或者您在哪裏以及如何申報這些實體。 –

回答

2

如果你想設置一個值,使用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引用,所以您不必擔心該函數可能會操縱輸入。

+0

謝謝!我有它的工作! –

0

您已聲明PhoneNumber_,Name_Address_string
但在setter方法,你逝去的unsigned (int)

而且,你已經逆轉getter和setter的用法!

此外,返回類型制定者可以只是void,而不是const void

1

Ehm。我認爲你應該使用getset以相反的方式... 在CreateCustomer你應該使用set功能,當打印Customer來流 - 你應該使用get功能。 而set職能應接收string,不unsigned

等等,最好用constructor,而不是set功能,然後將只有get功能。

+0

我認爲更重要的是要提到設置和獲取函數不應該存在於第一位... – Puppy

1
  1. 您應該在類聲明中使用std::。有關問題的原因,請參閱Why is 「using namespace std;」 considered bad practice?

  2. 您的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_,那麼爲什麼你使用get_方法?只需使用適當的set_方法並編寫temp->set_PhoneNumber(id);即可。

  • 通常避免在C++中使用指針。如果您確實需要指針,請使用像std::unique_ptrstd::shared_ptr這樣的智能指針(當且僅當您需要使用普通指針時:使用一個)。

  • 一個「空白」默認爲std::string值是像

    std::string const & id = std::string{}一個空字符串顯示更清晰的給我。

  • 要與你不需要做多Customer customer_object;因爲是使用了std::string默認構造函數導致空strign反正隱式聲明默認構造函數空/空字符串成員創建Customer類型的對象。

  • 通常一個構造函數用於根據一些參數值創建一個對象。

  • 你可以很容易地編寫一個通吃所需的值,可以通過添加沿

    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) 
    { } 
    

    線的東西到你的類反正作爲默認constructo。另見C++ Class Initialization List example

    另請參閱C++ Class Initialization List example

  • 對於封裝的緣故通常要避免使用「直接」 getter和setter揭示你的數據結構。
  • 相關問題