Ich habe eine Klasse mit einem Konstruktor, der eine nicht-const Referenz, die einem Mitglied der Klasse zugeordnet ist, nimmt. Jetzt möchte ich ein const-Objekt der Klasse erstellen, aber der Konstruktor beschwert sich, wenn ich eine const-Referenz an den Konstruktor übergebe. Der Code unten, der eine Vereinfachung meines ursprünglichen Codes darstellt, zeigt das Problem.Konstruieren von const-Objekt mit nicht-const
Soweit ich sagen kann, sollte es keine Probleme mit der Erstellung eines const Objekts, da es auf const Daten basiert?
Wie kann ich erreichen, was ich versuche in create_const_a
zu tun?
#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;
}
Der Fehler, den ich bekommen ist:
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: Nach ein paar neue Dinge zu lernen, wie const arbeitet mit Objekten und nicht konstanten Referenzen in ihnen, ich löste schließlich das ursprüngliche Problem durch Einführung eines anderen Typs, beispielsweise ConstA
, der nur const-Referenzen enthält, die dann in jedem der problematischen Fälle verwendet werden könnten.
Sie können von nicht-const zu const gehen, aber nicht umgekehrt. Der Konstruktor benötigt eine nicht-const, und Ihre 'create_const_a' erhält eine const. – AndyG
All diese Referenzen ... Wenn Sie fortfahren, werden Sie früher oder später zu einem Zeiger kommen, wo Sie eine hängende Referenz haben und schlimme Dinge passieren werden. * Warum * hast du Referenzen in der A-Klasse? Was ist das * aktuelle * Problem, das Sie mit einer solchen Lösung lösen möchten? –
Ihre Methode 'create_const_a' gibt einen Verweis auf ein lokales Objekt zurück. Das funktioniert nicht so, wie du denkst. Weitere Informationen finden Sie [diese Antwort] (http://stackoverflow.com/a/4643721/7359094). –