用户在C ++中定义的类型转换

时间:2016-09-23 17:30:11

标签: c++ oop type-conversion

我是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吗?

为什么会出现错误?

6 个答案:

答案 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;
    }
};

这应解决从浮点数中分配变量的问题。