У меня есть класс для значений давлений. В приведенном ниже коде вылезает ошибка:
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};
}
С помощью подсказок 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
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Нужно считать дерево сtxt файла
Подскажите пожалуйста, почему я могу считывать данные с файла, но значения переменных dblx, dblResult не записываются в файлНе могу найти ошибку
В общем есть такой код перегрузки оператора в классе нужно что бы оператор при присваивании менял значение поля материалКод вроде верно...