2010-01-20 6 views
18

Me gustaría saber cuál es la forma más eficiente y práctica de enviar un Qstring como parámetro a una función, en QT más específicamente. Quiero usar una referencia. El problema es que también quieren crear una instancia de esa cadena en la propia función como tal por ejemplo:¿Cuál es la mejor manera de enviar QStrings en una llamada a función?

este es el prototipo de la función:

void myFunction(QString & theMsg); 

esta es la llamada a la función:

myFunction(tr("Hello StringWorld")); 

ahora el function tr() devuelve un QString pero no funciona con una referencia (puedo ver por qué).

que tengo que hacer esto:

QString theQstr("Hello StringWorld"); 
myFunction(theQstr); 

¿Hay una manera más sencilla de hacer esto sin dejar de utilizar referencias o podría simplemente cambiar el parámetro de función para utilizar un QString y aún sería eficiente?

+0

Qué tal esto: myFunction (QString ("Hello StringWorld")); – Jamol

+0

Eso generó un mensaje de compilación. Creo que es porque esto solo genera un valor de retorno sin nada concreto a lo que hacer referencia. –

+0

Este enlace podría ayudar: [Right_way_to_pass_QString_to_methods] (http://developer.nokia.com/community/wiki/Right_way_to_pass_QString_to_methods) – ABCplus

Respuesta

14

QString utiliza COW (copiar al escribir) detrás de las escenas, por lo que la cadena real no se copia incluso si se utiliza una firma así:

vacío myFunction (QString theMsg)

(hasta que lo modifique).

Si desea absolutamente una referencia, utilizaría una const & a menos que tenga previsto modificar el argumento de entrada.

myFunction vacío (const QString & theMsg)

+0

No, eso es genial, ¡gracias! esto es lo que quería saber Entonces realmente hace lo mismo que un NSString en Objective-C en un mac. –

+13

Si observa el código fuente de Qt, verá que Qt tiende a pasar los tipos de Qt como funciones de configuración. A pesar de que usan COW, todavía hay algo más de sobrecarga al copiar una clase que simplemente pasar una referencia. – Colin

+0

@ Colin ¿Puede explicar más sobre eso? Acabo de ver la fuente y un QString es solo un contenedor alrededor de un puntero. I sizeof() ed 'QString' y' const QString & 'para estar seguro, y ambos tenían 4 bytes. Como un QString es básicamente un puntero (y los refs son punteros efectivamente), ¿por qué sería más eficiente pasar un puntero a un puntero en lugar de simplemente pasar el puntero? Parece que el const-ref sería un poco menos eficiente ... – weberc2

7

La forma más eficiente y práctico se utiliza una referencia constante. El QString COW será más lento que pasar por referencia, pero más rápido que una copia normal.

+1

¿Por qué? [más caracteres para que el comentario sea válido] – weberc2

Cuestiones relacionadas