'this'参数具有常量类型,但函数未标记为常量

'this' argument has type const but function is not marked const

本文关键字:常量 函数 记为 类型 参数 this      更新时间:2023-10-16

好吧,所以我在C++方面有点不在行,在我的第二个任务中,我被要求用公共和私有参数等创建类。基本上,赋值函数不会工作,因为它们显然不是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 << "nnDear ";
    cout << Charge[0].Holder.set_Name() << " (" << Charge[0].Holder.set_PhoneNumber() << ")";  //  DisplayCustomer(customer) ;
    cout << ",n" << Charge[0].Holder.set_Address() << "nn"

基本上,准确的错误消息是:

成员函数"set_Name"不可行:"this"参数的类型为"const"客户",但函数不是const 类型

set_PhoneNumber和set_Address也会发生这种情况。如有任何帮助,我们将不胜感激!谢谢

更新:我成功了。谢谢大家帮我!

如果要设置值,请使用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引用,您不必担心函数会操纵输入。

Ehm。我认为你应该以相反的方式使用getset。。。在CreateCustomer中,您应该使用set函数,而当打印Customer以流式传输时,您应使用get函数。并且set函数应该接收string,而不是unsigned

因此,最好使用constructor,而不是set函数,然后仅使用get函数。

  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_的值,那么为什么要使用get_方法呢?只需使用适当的set_方法并编写temp->set_PhoneNumber(id);即可。

  2. 通常避免使用C++中的指针。如果您确实需要一个指针,请使用像std::unique_ptrstd::shared_ptr这样的智能指针(如果并且仅当您需要使用纯指针时:请使用一个(。

  3. "空">std::string的默认值是类似的空字符串

    std::string const & id = std::string{}看起来更清晰。

  4. 要创建具有空/空成员字符串的Customer类型的对象,您不需要执行比Customer customer_object;更多的操作,因为有一个隐式声明的默认构造函数使用std::string默认构造函数,这无论如何都会导致空strign。

  5. 通常,构造函数用于根据某些参数值创建对象。

您可以很容易地编写一个包含所有必需值的构造函数,并且可以通过添加的内容来用作默认构造函数

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"getter和setter来暴露您的数据结构

您已经将PhoneNumber_Name_Address_声明为string
但是在setter方法中,您正在传递unsigned (int)

此外,您已经颠倒了getter和setter的用法!

此外,setter的返回类型可以只是void,而不是const void