Простой вопрос о назначении функции класса - PullRequest
1 голос
/ 12 мая 2011

пишу класс

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;
}

И я хочу присвоить его элементу массива следующим образом:

ans[a][b]= opera(t.a,t.b,i);

Почему он не может успешно скомпилироваться.

Однако это может работать:

opera tmp=opera(t.a,t.b,i);
ans[a][b]= tmp;

Конечно, опере структуры не требуется явная функция присваивания, и

ans[a][b]= opera(t.a,t.b,i);   

может работать напрямую.

Ответы [ 3 ]

5 голосов
/ 12 мая 2011

Если вы хотите назначить из временного, вам нужно

  opera& operator=(opera const& tmp){

Другая строка

opera tmp=opera(t.a,t.b,i);

- это инициализация нового объекта, а не присвоение.

2 голосов
/ 12 мая 2011
ans[a][b]= opera(t.a,t.b,i);

Почему он не может успешно скомпилироваться.

Это вызывает оператор присваивания, поэтому он не может компилироваться, поскольку временный объект, созданный из opera(t.a,t.b,i), не может быть связан с неконстантной ссылкой в ​​параметре оператора присваивания. Все, что вам нужно сделать, это:

 opera& operator=(const opera & tmp)
                //^^^^ note this
0 голосов
/ 12 мая 2011

Это потому, что ваш оператор копирования / ctor / оператор присваивания не принимает свой параметр по ссылке const. В противном случае, когда вы используете ans[i][j]=opera(a,b,c);, создается временный объект, и в соответствии со стандартом C ++ вы не можете получить неконстантную ссылку на этот объект. Следовательно, вам нужно использовать opera(const opera& o);

...