我是C ++的新手
下面是将英语距离对象(英尺'英寸")转换为米的代码,反之亦然
#include <iostream>
using namespace std;
class Distance
{
private:
const float MTF;
int feet;
float inches;
public:
Distance() : feet(0), inches(0.0), MTF(3.280833F) //no argument constructor
{ }
Distance(float meters) : MTF(3.28033F)//(1-arg constructor)
{//coverting metres to distance object
float fltfeet = MTF * meters;
feet = int(fltfeet);
inches = 12*(fltfeet-feet);
}
Distance(int ft, float in) : feet(ft), inches(in), MTF(3.280833F)
{ }
void getdist()//get distance from user
{
cout << "\nEnter feet: "; cin >> feet;
cout << "Enter inches: "; cin >> inches;
}
void showdist() const // o/p the distance
{ cout << feet << "\'-" << inches << '\"'; }
operator float() const //conversion operator
{ // converts distance to meters
float fracfeet = inches/12;
fracfeet += static_cast<float>(feet);
return fracfeet/MTF;
}
};
int main()
{
float mtrs;
Distance dist1 = 2.35F; //meters to distance
cout << "\ndist1 = "; dist1.showdist();
mtrs = static_cast<float>(dist1); //casting distance to meters
cout << "\ndist1 = " << mtrs << " meters\n";
Distance dist2(5, 10.25);
mtrs = dist2; //casting dist2 to meters
cout << "\ndist2 = " << mtrs << " meters\n";
Distance dist3; //new object dist3
dist3 = mtrs; //here is the error
//not converting meters to distance object
cout<<"\ndist3 = ";dist3.showdist();
return 0;
}
但代码显示错误:
在会员功能&#39;距离&amp; Distance :: operator =(const Distance&amp;)&#39;:
错误:非静态const成员&const; const float距离:: MTF&#39;,不能使用默认赋值运算符
应该将mtrs转换为object dist3吗?
为什么会出现错误?
答案 0 :(得分:3)
您的错误实际上是行
dist3 = mtrs;
不
Distance dist3;
原因是Distance
有一个const
成员变量。由于它是const
,因此无法将其分配给哪个,因为默认的复制分配和移动赋值运算符将被删除。
如果您想允许分配对象或编写自己的自定义分配功能,则必须重新考虑您的设计。
答案 1 :(得分:1)
如果您希望类范围保持不变,最好将类定义更改为:
class Distance
{
private:
static constexpr float MTF = 3.280833F;
int feet;
float inches;
public:
Distance() : feet(0), inches(0.0)
...
这将消除您获得的错误,并将按预期工作。另外,您不必像在代码中那样多次定义该常量值。
注意:如果你不能使用C ++ 11,你可以使MTF
全局常量(在cpp文件中的未命名命名空间中更好)或只是静态成员。无论哪种方式,它都将消除错误,您只需要定义一次,这样不容易出错。
答案 2 :(得分:1)
您必须覆盖赋值运算符。代码应如下所示
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("db.driver"));
dataSource.setUrl(env.getProperty("db.url"));
dataSource.setUsername(env.getProperty("db.username"));
dataSource.setPassword(env.getProperty("db.password"));
return dataSource;
}
像其他用户说的那样,你有一个“const”变量,所以你必须覆盖assigment运算符来满足你的要求。
答案 3 :(得分:0)
我认为错误来自
行dist3 = mtrs;
这里的问题是Distance
没有赋值类型为float
的赋值运算符,因此编译器会尝试创建Distance
类型的临时对象并构造它参数mtrs
;没关系,但下一步是将该临时值分配给dist3
,并且编译器抱怨它不能将临时对象中MTF
的值赋值为{{1在MTF
中因为dist3
是const。
由于MTF
,无法分配const
类型的对象。因此,例如,Distance
也会失败。这可能不是你想要的,你可以通过添加一个简单地忽略dist3 = dist2
的值的赋值运算符来解决这个问题。
答案 4 :(得分:0)
发生错误,因为您无法在类中声明@item
。您应该在类外定义const变量。您应该在此处将const
替换为const float MTF
。
答案 5 :(得分:0)
如其他答案所述,问题是您已将MTF
变量声明为const
。虽然有办法解决这个问题。您已将变量设置为const,因为它是常量且不应更改。相反,添加一个专用的Distance& operator=(float feet)
方法,在浮点值中传入时实际设置脚和英寸变量:
class Distance
{
private:
/* ... */
public:
/* ... */
Distance& operator=(float feet)
{
// Set the feet and inches here from
// the passed feet variable
return *this;
}
};
这应解决从浮点数中分配变量的问题。