У меня есть класс с конструктором, который принимает неконстантную ссылку, которая назначается члену класса. Теперь я хочу создать объект const указанного класса, но конструктор жалуется, если я передаю ссылку const на конструктор. Код ниже, который упрощает мой оригинальный код, демонстрирует проблему.Построение объекта const с использованием неконстантных
Насколько я могу судить, не должно возникнуть проблем с созданием объекта const, поскольку оно основано на данных const?
Как достичь того, что я пытаюсь сделать в create_const_a
?
#include <iostream>
class A {
private:
double &d;
const int &i;
public:
A(double &dd, const int &ii)
: d(dd), i(ii)
{}
void set_d(double a) {
d = a;
}
void print() const {
std::cout << d << " " << i << std::endl;
}
};
A create_a(double &dd, const int &ii) {
return A(dd,ii);
}
const A create_const_a(const double &dd, const int &ii) {
return A(dd,ii);
}
void foo(A a)
{
a.set_d(1.3);
a.print();
}
void bar(const A a)
{
a.print();
}
int main(int argc, char *argv[])
{
double d = 5.1;
int i = 13;
foo(create_a(d,i));
bar(create_const_a(d,i));
return 0;
}
Ошибки я получаю:
test.cc: In function ‘const A create_const_a(const double&, const int&)’:
test.cc:27:17: error: binding ‘const double’ to reference of type ‘double&’ discards qualifiers
return A(dd,ii);
^
test.cc:8:3: note: initializing argument 1 of ‘A::A(double&, const int&)’
A(double &dd, const int &ii)
^
Update: После обучения некоторых новых вещей о том, как сопзЬ работает с объектами и неконстантными ссылками в них, я в конце концов решил исходную задачу путем введения другого типа, например, ConstA
, который содержит только ссылки на const, которые затем могут использоваться в каждом из проблемных случаев.
Вы можете перейти от неконстантного к const, но не наоборот. Конструктор нуждается в не-const, и ваш 'create_const_a' получает const. – AndyG
Все эти ссылки ... Если вы продолжите, вы рано или поздно придете к указателю, где у вас есть болтливая ссылка, и плохие вещи произойдут. * Почему у вас есть ссылки в классе 'A'? Что такое * актуальная проблема, которую вы пытаетесь решить с помощью такого решения? –
Ваш метод 'create_const_a' возвращает ссылку на локальный объект. Это не работает так, как вы думаете. См. [Этот ответ] (http://stackoverflow.com/a/4643721/7359094) для получения дополнительной информации. –