Pregunta

Estimados amigos, me preocupa si estoy haciendo un mal uso de las referencias en C ++ En la siguiente GCC método se queja de advertencia "referencia a la variable local‘yo’regresado"

MatrizEsparsa& MatrizEsparsa::operator+(MatrizEsparsa& outra){
  MatrizEsparsa me(outra.linhas(),outra.colunas());
  return me;
}

Sin embargo, con los siguientes cambios que desaparezca la advertencia:

MatrizEsparsa& MatrizEsparsa::operator+(MatrizEsparsa& outra){
  MatrizEsparsa me(outra.linhas(),outra.colunas());
  MatrizEsparsa &ref = me;
  return ref;
}

Es el primer método (volviendo la variable 'ref') correcta \ aceptable?

¿Fue útil?

Solución

No. ref todavía se refiere a me que será destruida al final de la llamada.

Se debe devolver una copia de su resultado (no el prefijo &).

MatrizEsparsa MatrizEsparsa::operator+(const MatrizEsparsa& outra) const {
    return MatrizEsparsa(outra.linhas(),outra.colunas());
}

I también añadido dos especificadores const (para el parámetro y con el método) desde Dudo outra o el llamando necesidad ejemplo para ser modificadas en este caso. (Podría estar equivocado, pero entonces su operator+ tendría una extraña semántica)

Al hacer lo que hizo, que acaba de hacer el código más complejo. El compilador probablemente era confusa y no se podía advertir sobre el posible error.

Por lo general, cuando se tiene que utilizar trucos ingeniosos para hacer cosas simples, significa que algo está mal.

Otros consejos

creo que estás confundiendo sus operadores.

Hay 2:

struct Foo
{
  Foo& operator+=(Foo const&);
  Foo operator+(Foo const&) const;
};

Como se observa, los primeros devuelve una referencia a sí mismo, el segundo no lo hace.

También, en general, el segundo debe ser escrito como una función libre.

Foo operator+(Foo const&, Foo const&);

Esto puede ser automatizado, porque es engorroso, usando Boost.Operators:

struct Foo: boost::addable<Foo>
{
  Foo& operator+=(Foo const& rhs)
  {
    // add
    return *this;
  }
};

La pequeña magia boost::addable generará automáticamente la aplicación + basado en Foo::operator+=.

No es aceptable. En realidad, es el mismo problema:. Devolver una referencia no const a un objeto local que será destruida después de volver el método

No, usted debe devolver un valor aquí, idealmente un valor const. Ver efectiva C ++, artículo 21.

Le sugiero la siguiente interfaz:

const MatrizEsparsa operator+(const MatrizEsparsa& left, const MatrizEsparsa& right);

Tenga en cuenta que todo lo que es o bien una referencia o un valor const const. Volviendo un valor const no es tan importante como devolver un valor o declarando los parámetros como referencias const, pero los argumentos de Scott Meyers me han convencido, aunque nadie los sigue.

No se puede devolver la referencia, puesto que el objeto que se está haciendo referencia destruidos fuera de su control. O bien poner "yo" como una variable miembro de MatrizEsparsa modo que persistirá después de la ejecución de la función de los demás devolver un puntero o una smart_ptr impulso, que apunta al objeto.

En vista de que este es un operador +, sin embargo, es probable que desee devolver un valor en lugar de una referencia a un interno variable a la función.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top