2016-09-23 2 views
-2

Я новичок в C++определенные пользователем преобразования типов в 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; 
} 

но код показывает ошибку:

In member function 'Distance& Distance::operator=(const Distance&)':

error: non-static const member 'const float Distance::MTF', can't use default assignment operator

should'nt это будет преобразование ССО объекта dist3

почему ошибка ОКК? Урс?

+0

Измените свой вопрос, чтобы он содержал [mcve]. Отображаемая ошибка генерируется из другого исходного кода, чем вы предоставили. – Slava

+0

Возможный дубликат [назначение класса с константным членом] (http://stackoverflow.com/questions/11601998/assignment-of-class-with-const-member) –

+0

Это не относится к проблеме, с которой вы сталкиваетесь , но вы установили MTF для разных значений в конструкторе 'Distance (float meters)' по сравнению с вашими конструкторами 'Distance()' и 'Distance (int ft, float in)'. Это одна из причин, по которым сывороточный ответ Славы ниже, если вы можете использовать C++ 11. – Jvinniec

ответ

3

Вы ошибка на самом деле с линией

dist3 = mtrs; 

не

Distance dist3; 

Причина этого заключается в том Distance имеет переменную с const члена. Поскольку он равен const, он не может быть назначен на то, чтобы вызвать назначение копии по умолчанию и переместить операторы присваивания для удаления.

Вам нужно будет переосмыслить свой дизайн, если вы хотите разрешить назначение объектов или написать свои собственные функции назначения.

+0

Очевидным решением было бы сделать это поле статическим – Slava

+0

@Slava Это или просто глобальная константа. Не уверен, какой путь лучше. – NathanOliver

0

я понял, что ошибка происходит на линии

dist3 = mtrs; 

Проблема здесь состоит в том, что Distance не имеет оператор присваивания, который принимает аргумент типа float, поэтому компилятор пытается создать временный объект введите Distance и постройте его с аргументом mtrs; это нормально, но следующим шагом является присвоение этого временного значения dist3, и компилятор жалуется, что он не может назначить значение MTF во временном объекте на значение MTF в dist3, поскольку MTF является константой.

Из-за этого const объекты типа Distance не могут быть назначены. Так, например, dist3 = dist2 также потерпит неудачу. Это, вероятно, не то, что вы намеревались, и вы можете исправить это, добавив оператор присваивания, который просто игнорирует значение MTF.

0

Ошибка возникает, потому что вы не можете объявить const внутри класса. Вы должны определить переменную const вне класса. Вы должны заменить const float MTF на float MTF здесь.

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) или просто статический член. В любом случае это устранит ошибку, и вам нужно будет определить ее только один раз, что менее подвержено ошибкам.

+0

Просто обратите внимание, что вам нужно скомпилировать флаги C++ 11 (т. Е. 'Std = C++ 11'), чтобы это решение работало. В противном случае во время компиляции вы получите предупреждения или ошибки. – Jvinniec

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

Это должно решить проблему присвоения переменной с плавающей точкой.

1

Вы должны переопределить оператор присваивания. А код должен быть такими, как показано ниже

#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) 
    { } 
    Distance(float meters) : MTF(3.28033F) 
    { 
     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() 
    { 
     cout << "\nEnter feet: "; cin >> feet; 
     cout << "Enter inches: "; cin >> inches; 
    } 
    void showdist() const 
    { cout << feet << "\'-" << inches << '\"'; } 
    operator float() const 
    { 
     float fracfeet = inches/12; 
     fracfeet += static_cast<float>(feet); 
     return fracfeet/MTF; 
    } 

    Distance& operator=(const Distance & otherD) 
    { 
     feet = otherD.feet; 
     inches = otherD.inches; 

     return *this; 
    } 
}; 
int main() 
{ 
    float mtrs; 
    Distance dist1 = 2.35F; 
    cout << "\ndist1 = "; dist1.showdist(); 
    mtrs = static_cast<float>(dist1); 

    cout << "\ndist1 = " << mtrs << " meters\n"; 
    Distance dist2(5, 10.25); 
    mtrs = dist2; 
    cout << "\ndist2 = " << mtrs << " meters\n"; 
    Distance dist3; //here is the error 
    dist3 = (Distance)mtrs ; 


    //cout<<"\ndist3 = ";dist3.showdist(); 
    return 0; 
} 

Как другой пользователь сказал, у вас есть «константный» переменный, так что вы должны переопределить распайка оператор для решения ваших потребностей.

+0

OP не нужно это делать, это одно из возможных решений, а не самое лучшее. – Slava

+0

Должен ли аргумент 'operator =' быть float, так как 'mtrs' является float? – Jvinniec

+0

Попробуйте визуальную студию. Я не вижу ошибок компиляции, и все работает так, как ожидалось. – Naidu

Смежные вопросы