21

Esto es algo que nunca conseguí con con-ref y realmente espero que alguien me lo explique.const-ref al enviar señales en Qt

Al llamar a una función dentro de otra función, entiendo que const-ref es la mejor manera al pasar objetos de pila que no planeo manipular. Por ejemplo:

void someInnerFunction(const QString& text) { 
    qDebug() << text; 
} 

void someFunction() { 
    QString test = "lala"; 
    .... 
    someInnerFunction(test); 
} 

Hasta ahora todo bien, supongo. Pero, ¿y las señales? ¿No hay ningún riesgo que conlleva pasar una referencia? Aunque es const. Parece que he estado leyendo todos los documentos sobre const-ref, pero todavía encuentro un poco arriesgado ya que lo entiendo como "enviar una referencia a un objeto y mantenerlo const". ¿Qué sucede si el objeto al que se refiere está fuera del alcance?

Por ejemplo:

void someFunction() { 
    connect(this, SIGNAL(someSignal(const QString&)), this, SLOT(someSlot(const QString&))); 

    QString test = "lala"; 
    emit someSignal(test); 

    // doesnt test go out of scope here? and since im not using queued connection the QString object doesnt get copied. 
} 

void someSlot(const QString& test) { 
    qDebug() << test; // will this work? 
} 

Lo que realmente está pasando aquí? Frecuentemente uso const-ref en llamadas a funciones donde solo quiero acceder al objeto pero no cambiarlo. Pero, ¿y las señales? La mayoría de las señales parecen tener const-ref parm en el Qt doc, pero ¿cómo funciona?

+0

* "Cuando se llama a una función dentro de otra función, entiendo que const-ref es la mejor manera al pasar objetos" * Eso es una respuesta muy única para un problema fundacional de C++, ¿quién te dijo eso? – HostileFork

+0

quiero decir si no planea cambiarlos. Parece que qt usa ese enfoque en todas partes y sí, no lo hago en todas partes. pero ¿cuándo no sería bueno? y solo estoy hablando de stack-objects donde no quiero copiarlos a la función – chikuba

+0

, básicamente pensé que la siguiente discusión interrelacionaba cuando un stackobject tenía que pasarse como un parm. http://stackoverflow.com/questions/270408/is-it-better-in-c-to-pass-by-value-or-pass-by-constant-reference pero mi pregunta era más qué hacer con las señales ya que algunas personas dicen que debe hacerse por const-ref para que no tengamos que copiar el objeto – chikuba

Respuesta

17

De acuerdo con this answer, Qt simplemente reemplaza las referencias de const con copias.

EDITAR: Aparentemente no siempre es el caso ... Acabo de hacer un programa de prueba básico con un hilo, y la referencia se pasó correctamente. Su constidad permaneció intacta, también. De todos modos, sí, debes ser cauteloso con la variable que se sale del alcance, además de que no puedes enviar referencias a través de los hilos de esta manera. Si lo hace, solo se pasarán las copias.

Para responder a las preguntas en los comentarios de su ejemplo, sí, funcionará independientemente de si se trata de una conexión directa o en cola. Si se trata de una conexión directa, funcionará porque someSlot() se ejecutará antes de someFunction() finaliza; si es una conexión en cola, funcionará porque test se copiará en lugar de pasarse por referencia.

+6

¿dónde lo leíste?Todo lo que vi fue "Para las conexiones directas, se recomienda que los valores se pasan por referencia constante para evitar copias innecesarias. Para las conexiones en cola Qt hará una copia sin importar lo que pase los argumentos" – chikuba

+0

@chikuba Por favor ver las ediciones. – Anthony

+1

"De todos modos, sí, debe tener cuidado con la variable que sale fuera del alcance" - No veo dónde esto debería ser un problema a menos que pase objetos a través del puntero. –

0

En Qt, al emitir una señal que está conectada a una ranura o ranuras, equivale a una llamada de función síncrona ... a menos que haya configurado sus señales y ranuras para usar conexiones en cola, entonces es una llamada asíncrona y debe tener cuidado al pasar datos de la pila y debe pasar una copia como si pasara datos a otra secuencia.

+2

objetos pasados ​​a través de const refs se copian para conexiones asíncronas (en cola). No hay peligro de que los datos de la pila salgan de su alcance a menos que los pase a través del puntero. –

+0

¿qué quiere decir con "pasarlos por un puntero"? – chikuba

Cuestiones relacionadas