copie Je veux appliquer la conversion explicite entre struct un peu comme les types natifs:C++ - opérateur d'affectation appel à la création au lieu de constructeur
int i1;
i1 = some_float; // this generates a warning
i1 = int(some_float): // this is OK
int i3 = some_float; // this generates a warning
Je pensais que d'utiliser un opérateur d'affectation et de copie constructeur pour faire la même chose , mais le comportement est différent:
Struct s1;
s1 = other_struct; // this calls the assignment operator which generates my warning
s1 = Struct(other_struct) // this calls the copy constructor to generate a new Struct and then passes that new instance to s1's assignment operator
Struct s3 = other_struct; // this calls the COPY CONSTRUCTOR and succeeds with no warning
y a-t-il des astuces pour obtenir ce troisième cas Struct s3 = other_struct;
construction s3 avec le constructeur par défaut, puis appeler l'opérateur d'affectation?
Tout cela se compile et s'exécute comme il se doit. Le comportement par défaut de C++ consiste à appeler le constructeur de copie au lieu de l'opérateur d'affectation lorsque vous créez une nouvelle instance et appelez le constructeur de copie à la fois, (par exemple, MyStruct s = other_struct;
devient MyStruct s(other_struct)
et non MyStruct s; s = other_struct;
. astuces pour contourner cette
EDIT:. Le mot-clé "explicite" est juste ce que je devais
class foo {
foo(const foo& f) { ... }
explicit foo(const bar& b) { ... }
foo& operator =(const foo& f) { ... }
};
foo f;
bar b;
foo f2 = f; // this works
foo f3 = b; // this doesn't, thanks to the explicit keyword!
foo f4 = foo(b); // this works - you're forced to do an "explicit conversion"
Postez une version abrégée du code réel s'il vous plaît. Affichez également les avertissements et les erreurs. Il me semble que vous voulez faire quelque chose de vraiment stupide et le compilateur vous le dit. –
@San Jacinto: Je pense que Chris veut écrire des classes de telle sorte que * si * Chris (ou quelqu'un d'autre) fait quelque chose de vraiment idiot, alors le compilateur le dira. –
Attendez, cette question a-t-elle fondamentalement changé? –