'this'参数具有常量类型,但函数未标记为常量
'this' argument has type const but function is not marked const
好吧,所以我在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。我认为你应该以相反的方式使用get
和set
。。。在CreateCustomer
中,您应该使用set
函数,而当打印Customer
以流式传输时,您应使用get
函数。并且set
函数应该接收string
,而不是unsigned
。
因此,最好使用constructor
,而不是set
函数,然后仅使用get
函数。
-
您应该在类声明中使用
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_
的值,那么为什么要使用get_方法呢?只需使用适当的set_方法并编写temp->set_PhoneNumber(id);
即可。通常避免使用C++中的指针。如果您确实需要一个指针,请使用像
std::unique_ptr
或std::shared_ptr
这样的智能指针(如果并且仅当您需要使用纯指针时:请使用一个(。"空">
std::string
的默认值是类似的空字符串std::string const & id = std::string{}
看起来更清晰。要创建具有空/空成员字符串的
Customer
类型的对象,您不需要执行比Customer customer_object;
更多的操作,因为有一个隐式声明的默认构造函数使用std::string
默认构造函数,这无论如何都会导致空strign。通常,构造函数用于根据某些参数值创建对象。
您可以很容易地编写一个包含所有必需值的构造函数,并且可以通过添加的内容来用作默认构造函数
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++类初始化列表示例。
- 为了封装,您通常希望避免使用">direct"getter和setter来暴露您的数据结构
您已经将PhoneNumber_
、Name_
和Address_
声明为string
但是在setter方法中,您正在传递unsigned (int)
此外,您已经颠倒了getter和setter的用法!
此外,setter的返回类型可以只是void
,而不是const void
。
- 常量函数,当其参数是对文字类型的引用时
- 为什么在C++使用常量函数时常量是多余的?
- 是否可以使用非常量指针调用非常量函数,以及当两个unique_ptrs指向同一个对象时程序的行为方式?
- 为什么在PIMPL中无法访问实现类的常量函数?
- 常量函数参数的专业化
- 如何调用非常量函数而不是常量函数?
- 常量和非常量函数作为模板参数参数
- 通过引用常量函数调用另一个类的非常量函数
- C++编译器如何检测非常量函数体
- 使用常量函数返回常量引用时出现奇怪的行为
- 常量字符数组模板与字符常量* 函数重载
- 现代C++编译器是否能够避免在某些条件下两次调用常量函数
- 将函数声明为 GCC 纯函数或常量函数的效果(当它不是时)
- 为什么常量/非常量函数重载的继承不明确
- 类型定义模板,接受指向常量和非常量函数的指针
- 如何避免语法相同的常量和非常量函数之间代码重复,这些函数在语义上不相同
- 继承的常量函数
- 不确定 c++ 中的常量函数是什么
- 在常量函数中使用安全的非常量函数
- c++如何定义其他开发人员需要调用的常量函数顺序