string constからの非推奨変換。 wchar_t*へ
-
04-10-2019 - |
質問
こんにちは私はポートアドレスを含むWCHAR_Tアレイへのポインターであるメンバー変数を使用する必要があるポンプクラスを持っています:「com9」。
問題は、コンストラクターでこの変数を初期化すると、コンパイラが減価償却の変換警告にフラグを立てることです。
pump::pump(){
this->portNumber = L"com9";}
これは正常に機能しますが、コンパイルするたびに警告は廃止されており、何か間違ったことをしているように感じます。
配列を作成してから、次のようなメンバー変数を設定しようとしました。
pump::pump(){
wchar_t port[] = L"com9";
this->portNumber = port;}
しかし、何らかの理由で、これは「F」で私のポートナンバーポイントになります。
明らかに私の側の別の概念的な問題。
私のお話しの質問に感謝します。
編集:
リクエストとして、portnumberの定義は次のとおりです。
class pump
{
private:
wchar_t* portNumber;
}
回答のおかげで、それは今に変更されました:
class pump
{
private:
const wchar_t* portNumber;
}
解決
もしも portNumber
aです wchar_t*
, 、それはaでなければなりません const wchar_t*
.
文字列リテラルは不変であるため、要素はそうです const
. 。文字列の文字通りからコンスト以外のポインターから非コンストポインターへの非推奨変換が存在しますが、それは危険です。タイプの安全性を維持し、安全でない変換を使用しないように変更を加えます。
2つ目は、ローカル変数の内容を指すために失敗します。コンストラクターが終了すると、変数がなくなり、無効な場所を指しています。それを使用すると、未定義の動作が生じます。
最後に、初期化リストを使用します。
pump::pump() :
portNumber(L"com9")
{}
初期化リストは初期化、コンストラクターは構造を完了することです。 (また、 this->
ほとんどすべてのC ++人に醜いです。それは素晴らしく、冗長ではありません。)
他のヒント
使用する const wchar_t*
文字通りを指す。
コンバージョンが存在する理由は、Cの初期バージョンから有効になっており、文字列リテラルを非コンストポインター[*]に割り当てるためです。それが非推奨される理由は、文字通りを変更することが無効であり、コンスト以外のポインターを使用して変更してはならないものを参照するのは危険です。
*] Cは元々持っていませんでした const
. 。いつ const
追加された、明らかに文字列リテラルに適用する必要がありますが、前に書かれたコードがすでにありました const
存在した、突然あなたが振りかけなければならなかった場合、それは壊れます const
どこにでも。私たちは、言語への変化の変化に対して、今日でも支払いをしています。それはあなたが使用しているC ++であるため、この言語の壊れた変化さえありませんでした。
どうやら、 portNumber
aです wchar_t *
(コンスト以外)、正しいですか?もしそうなら:
文字列リテラルは読み取り専用であるため、最初のものは間違っています(それらはcharの配列へのconst pointersです いつもの 実行可能ファイルの文字列テーブルに保存されます。これは、多くの場合、読み取りページにメモリにマッピングされます)。
醜い、暗黙的な変換への非コンストへの変換char
S/wchar_t
sは、書かれた古いコードとの互換性を達成するために承認されました。const
存在しませんでした。悲しいことに、それは何を知らない多くのバカにさせます const正しい Const Pointersが正しい選択であっても、コンストのないポインターを要求するコードを書くことを手に入れることを意味します。2つ目はあなたが作っているので間違っています
portNumber
スタックに割り当てられた変数を指します。これは、コンストラクターが戻ってきたときに削除されます。コンストラクターが戻った後、ポインターが保存されましたportNumber
ランダムガベージを指します。
正しいアプローチは宣言することです portNumber
なので const wchar_t *
変更する必要がない場合。代わりに、それ します クラスの生涯に変更する必要があります。通常、最良のアプローチは、Cスタイルの文字列をまったく避け、ただ投げることです。 std::wstring
, 、それは文字列に関連するすべての簿記の世話をします。