1

私は C(++) の専門家ではないので、この場合は QString を QString* に変換したくないコンパイラの頑固さに困惑しています。私は機能を持っています:

bool getNextMessage(int sId, QString *msg, QString *cmd)

ここでポインターを使用しているのは、C で複数の変数 (甘やかされて育った Perl コーダー;)) を返すことができず、これを while(getNextMessage(...)){...} スタイルのループで使用したいからです。その関数内には、いくつかの SQL foo とこれがあります。

 msg = QString("");
 cmd = QString("");
 return false;

コンパイラがこれから生成するのは次のとおりです。

 cannot convert 'QString' to 'QString*' in assignment

親愛なる皆さん、私のために謎を解いていただけませんか?ありがとう。:)

編集: 解決策: leemes からの参照へのポインターのおかげで、参照を使用するようになりました。

4

3 に答える 3

5

これには通常、ポインタではなく参照を使用します。C++ の初心者にとって、違いが何であるかを理解するのは困難です。簡単な説明は、「参照はより安全なポインターです」です。

bool getNextMessage(int sId, QString &msg, QString &cmd)

このようにして、事前にポインターに変換せずにメソッドを呼び出し、通常の変数を操作するのと同じ構文で参照を使用できるため、文字列の内容を設定するコードは問題ありません。

ポインターに固執したい場合、またはポインターを使用してそれを行う方法を理解したい場合は、次のようにポインターを操作します。

*msg = QString("");

*msgdereferences 、つまり、ポインターの背後msgにあるオブジェクトを操作していることを意味します。関数呼び出しには、演算子があります。->

通話中

msg = new QString("");

構文的にも正しいですが、期待どおりの動作をしません! この行は、新しい QString オブジェクトを割り当て、この新しく作成されたオブジェクトのポインターを取得することを意味します。次に、このポインターを に割り当てますmsg。これは、関数内の次のコードでは問題ありません。ただし、ポイントするmsgメモリではなく、それ自体 (ポインターアドレス)を変更msgしました。これは、発信者がここで何も気付かないことを意味します。呼び出し元は、関数呼び出しの後、古いポインターで動作します。

于 2012-12-19T11:55:04.600 に答える
4

以下を使用してみてください。

*msg = QString("");
*cmd = QString("");

ポインタが初期化されていることを確認してください。

于 2012-12-19T11:56:29.677 に答える
0

まあ aQStringは a ではありませんQString*。おそらく、ポインタを逆参照して、それが指しているオブジェクトに代入したいでしょう:

*msg = QString("");

または、以下が同等であると思います:

*msg = "";
于 2012-12-19T11:54:38.280 に答える