Аргумент функции в виде объекта класса

286
07 декабря 2017, 00:52

У меня есть класс для значений давлений. В приведенном ниже коде вылезает ошибка:

class PressureValue
{
public:
    enum pressureMeasureUnit {puUnknown, puAuto, puAtmosphere, puTechAtmosphere,
                              puKgCm2, puPascal, puMillimetreOfMercury, puTor, puMillibar}pressureMeasureUnitP;
    PressureValue(PressureValue::pressureMeasureUnit defaultUnit = puKgCm2){
        defaultPressureUnit = defaultUnit;
    }
    ~PressureValue(){}
    float value = 0.0;
    //перегрузка оператора
    PressureValue& operator=(float f){
        value = f;
        return *this;
    }
    operator float() const{
        return value;
    }
private:
    pressureMeasureUnit defaultPressureUnit;
    pressureMeasureUnit convertingUnit;
};

void doSomething(PressureValue newSensor = 1.0){
    //do something
}
int main(){
    PressureValue p(PressureValue::puMillibar);
}

prog.cpp:36:47: error: could not convert ‘1.0e+0’ from ‘double’ to ‘PressureValue’ void doSomething(PressureValue newSensor = 1.0){

Проблема №1 Т.е. я хочу, чтобы ф-я doSomething по умолчанию работала с давлением 1.0 ед.изм., но не могу установить аргумент по умолчанию. Зато работает так:

void doSomething(PressureValue newSensor = PressureValue::puMillimetreOfMercury){
    //do something
}

И, соответственно, я не могу сделать так из-за той же ошибки:

int main(){
    PressureValue p = 1.0;
}

Проблема №2 Есть ли возможность задать поле value при первоначальном создании экземпляра класса и при этом оставить возможность задавать единицы измерения (PressureValue::pressureMeasureUnit), т.е. иметь возможность делать что-то вроде этого:

int main(){
    PressureValue p{PressureValue::puMillimetreOfMercury} = 1.0;
}

Edit: Проблему №1 решил, добавив конструктор

PressureValue(const float newValue){
    value = newValue;
}

Так работает:

void doSomething(PressureValue newSensor = 1.0){
    //do something
}

Проблему №2 решил, добавив конструктор с двумя параметрами

PressureValue(PressureValue::pressureMeasureUnit newUnit, float newValue){
    currentUnit = newUnit;
    value = newValue;
}

Работает так:

int main(){
    PressureValue p = {PressureValue::puMillimetreOfMercury, 1.0};
}
Answer 1

С помощью подсказок VTT, кажется, удалось решить все проблемы. Рабочий код:

#ifndef UNITS_H
#define UNITS_H
class PressureValue
{
public:
    enum pressureMeasureUnit {puUnknown, puAuto, puAtmosphere, puTechAtmosphere,
                              puKgCm2, puPascal, puMillimetreOfMercury, puTor, puMillibar}pressureMeasureUnitP;
    PressureValue(PressureValue::pressureMeasureUnit defaultUnit = puKgCm2){
        currentUnit = defaultUnit;
    }
    PressureValue(const float newValue){
        value = newValue;
    }
    PressureValue(PressureValue::pressureMeasureUnit newUnit, float newValue){
        currentUnit = newUnit;
        value = newValue;
    }
    ~PressureValue(){}
    float value = 0.0;
    //перегрузка оператора присваивания
    PressureValue& operator=(float f){
        value = f;
        return *this;
    }
    operator float() const{
        return value;
    }
private:
    pressureMeasureUnit currentUnit;
};
void doSomething(PressureValue newSensor = 1.0){
    //do something
}
void doSomethingToo(PressureValue newSensor = {PressureValue::puMillimetreOfMercury, 1.0}){
    //do something
}
int main(){
    PressureValue p = {PressureValue::puMillimetreOfMercury, 1.0};
    PressureValue d = p;
    PressureValue c = 3.0;
}
#endif // UNITS_H
READ ALSO
Ошибка ERROR_ACCESS_DENIED при открытии файла

Ошибка ERROR_ACCESS_DENIED при открытии файла

Доброго времени сутокСуть вопроса такова:

189
Не могу записать числовые данные в текстовый файл

Не могу записать числовые данные в текстовый файл

Подскажите пожалуйста, почему я могу считывать данные с файла, но значения переменных dblx, dblResult не записываются в файлНе могу найти ошибку

208
Перегрузка оператора =

Перегрузка оператора =

В общем есть такой код перегрузки оператора в классе нужно что бы оператор при присваивании менял значение поля материалКод вроде верно...

157