質問

こんにちは私はポートアドレスを含む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です いつもの 実行可能ファイルの文字列テーブルに保存されます。これは、多くの場合、読み取りページにメモリにマッピングされます)。
    醜い、暗黙的な変換への非コンストへの変換 charS/wchar_tsは、書かれた古いコードとの互換性を達成するために承認されました。 const 存在しませんでした。悲しいことに、それは何を知らない多くのバカにさせます const正しい Const Pointersが正しい選択であっても、コンストのないポインターを要求するコードを書くことを手に入れることを意味します。

  • 2つ目はあなたが作っているので間違っています portNumber スタックに割り当てられた変数を指します。これは、コンストラクターが戻ってきたときに削除されます。コンストラクターが戻った後、ポインターが保存されました portNumber ランダムガベージを指します。

正しいアプローチは宣言することです portNumber なので const wchar_t * 変更する必要がない場合。代わりに、それ します クラスの生涯に変更する必要があります。通常、最良のアプローチは、Cスタイルの文字列をまったく避け、ただ投げることです。 std::wstring, 、それは文字列に関連するすべての簿記の世話をします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top