对浮点值使用 += 运算符
Using += operator with float values
我正在尝试实现一个运算符函数来解决下一个错误:
error: assignment of member 'Animal::weight' in read-only object weight +=amount*(0.02f);
我的 Animal.cpp 函数如下所示:
void Animal::feed(float amount) const
{
if (type == "sheep"){
amount=amount*(0.02f);
weight+=amount;
}else if (type == "cow"){
weight +=amount*(0.05f);
}else if (type == "pig"){
weight +=amount*(0.1f);
}
return weight;
}
Animal.h(短版):
class Animal
{
public:
Animal(std::string aType, const char *anSex, float aWeight, QDateTime birthday);
float getWeight() const {return weight;};
void setWeight(float value) {weight = value;};
float feed(float amount) const;
void feedAnimal(float amount);
private:
float weight;
};
float operator+=(const float &weight,const float &amount);
然后我实现了一个+=运算符。
float operator+=(const float &weight,const float &amount);
随后也包含在 .cpp 文件中:
Animal & operator +=(Animal &animal, float amount){
float w = animal.getWeight();
animal.setWeight(w+amount);
}
我使用了一个参考,以便更新每只动物的体重。所以我可以调用函数 feed,当我想知道结果时,我可以使用 get 函数:
float getWeight() const {return weight;};
但出于某种原因,我发现了下一个错误:
'float operator+=(const float&, const float&)' must have an argument of class or enumerated type
float operator+=(const float &weight,const float &amount);
有什么解决办法吗?
关于使用feed功能我也遇到了问题。我有我的 Farm.cpp class,我在那里循环寻找农场中的所有动物。
void Farm::feedAllAnimals(float amount)
{
for (auto an : animals) {
if(an != nullptr) {
an->feed(amount);
}
}
std::cout << "all animals fed with " << amount << "kg of fodder";
}
在我的 .h 文件中我有这些函数:
Public:
void feedAllAnimals(float amount);
Private:
std::vector<std::shared_ptr<const Animal>> animals;
我的错误:
error: passing 'const Animal' as 'this' argument of 'float Animal::feed(float)' discards qualifiers [-fpermissive] an->feed(amount);
^
您将函数 feed 声明为 const 成员函数
void feed(float amount) const;
^^^^^
如果对象是常量对象,则不能更改它。
至于运算符
float operator+=(const float &weight,const float &amount);
那么您不能重载基本类型的运算符。
我认为你的意思是以下
Animal & operator +=( Animal &animal, float amount);
例如
Animal & operator +=( Animal &animal, float amount)
{
animal.setWeight( animal.getWeight() + amount );
return animal;
}
或在 class 中声明为成员函数的运算符 like
Animal & operator +=( float amount );
对于向量,如果要更改 evctor 的元素指向的对象,则模板参数必须没有限定符 const
std::vector<std::shared_ptr<Animal>> animals;
我正在尝试实现一个运算符函数来解决下一个错误:
error: assignment of member 'Animal::weight' in read-only object weight +=amount*(0.02f);
我的 Animal.cpp 函数如下所示:
void Animal::feed(float amount) const
{
if (type == "sheep"){
amount=amount*(0.02f);
weight+=amount;
}else if (type == "cow"){
weight +=amount*(0.05f);
}else if (type == "pig"){
weight +=amount*(0.1f);
}
return weight;
}
Animal.h(短版):
class Animal
{
public:
Animal(std::string aType, const char *anSex, float aWeight, QDateTime birthday);
float getWeight() const {return weight;};
void setWeight(float value) {weight = value;};
float feed(float amount) const;
void feedAnimal(float amount);
private:
float weight;
};
float operator+=(const float &weight,const float &amount);
然后我实现了一个+=运算符。
float operator+=(const float &weight,const float &amount);
随后也包含在 .cpp 文件中:
Animal & operator +=(Animal &animal, float amount){
float w = animal.getWeight();
animal.setWeight(w+amount);
}
我使用了一个参考,以便更新每只动物的体重。所以我可以调用函数 feed,当我想知道结果时,我可以使用 get 函数:
float getWeight() const {return weight;};
但出于某种原因,我发现了下一个错误:
'float operator+=(const float&, const float&)' must have an argument of class or enumerated type
float operator+=(const float &weight,const float &amount);
有什么解决办法吗?
关于使用feed功能我也遇到了问题。我有我的 Farm.cpp class,我在那里循环寻找农场中的所有动物。
void Farm::feedAllAnimals(float amount)
{
for (auto an : animals) {
if(an != nullptr) {
an->feed(amount);
}
}
std::cout << "all animals fed with " << amount << "kg of fodder";
}
在我的 .h 文件中我有这些函数:
Public:
void feedAllAnimals(float amount);
Private:
std::vector<std::shared_ptr<const Animal>> animals;
我的错误:
error: passing 'const Animal' as 'this' argument of 'float Animal::feed(float)' discards qualifiers [-fpermissive] an->feed(amount);
^
您将函数 feed 声明为 const 成员函数
void feed(float amount) const;
^^^^^
如果对象是常量对象,则不能更改它。
至于运算符
float operator+=(const float &weight,const float &amount);
那么您不能重载基本类型的运算符。 我认为你的意思是以下
Animal & operator +=( Animal &animal, float amount);
例如
Animal & operator +=( Animal &animal, float amount)
{
animal.setWeight( animal.getWeight() + amount );
return animal;
}
或在 class 中声明为成员函数的运算符 like
Animal & operator +=( float amount );
对于向量,如果要更改 evctor 的元素指向的对象,则模板参数必须没有限定符 const
std::vector<std::shared_ptr<Animal>> animals;