Une simple question de l'attribution de la fonction de la classe
Question
J'écris une classe
struct opera{
int a,b;
int op;
opera(int a1=0,int b1=0,int op1=-1):a(a1),b(b1),op(op1){}
opera& operator=(opera& tmp){
a=tmp.a;
b=tmp.b;
op=tmp.op;
}
Et je veux attribuer à un élément de tableau comme ceci:
ans[a][b]= opera(t.a,t.b,i);
Pourquoi il ne peut pas compiler avec succès.
Toutefois, cela peut fonctionner:
opera tmp=opera(t.a,t.b,i);
ans[a][b]= tmp;
Bien sûr,la structure de l'opéra n'avez pas besoin d'une affectation explicite de la fonction, et
ans[a][b]= opera(t.a,t.b,i);
permet de travailler directement.
La solution
Lorsque vous souhaitez attribuer d'un temporaire, vous avez besoin
opera& operator=(opera const& tmp){
l'autre ligne
opera tmp=opera(t.a,t.b,i);
est une initialisation d'un nouvel objet et non d'une affectation.
Autres conseils
ans[a][b]= opera(t.a,t.b,i);
Pourquoi il ne peut pas compiler avec succès.
Qui appelle opérateur d'affectation, c'est pourquoi il ne peut pas compiler, car l'objet temporaire créé à partir de opera(t.a,t.b,i)
ne peut pas être liée à la non-const de référence à l'opérateur d'affectation du paramètre.Tout ce que vous devez faire est ceci:
opera& operator=(const opera & tmp)
//^^^^ note this
C'est parce que votre copie ctor/opérateur d'affectation n'est pas la prise de son paramètre par référence const.Sinon, lorsque vous utilisez ans[i][j]=opera(a,b,c);
un objet temporaire est créé, et selon la norme C++, vous ne pouvez pas prendre une non-const de référence pour cet objet.Par conséquent, vous devez utiliser opera(const opera& o);