2

ヘッダーファイルに、次のように3つの配列を作成して設定するクラスを作成しました。

class ExampleClass {
private:
    string array1[5] = {"test1", "test2", "test3", "test4", "test5"};
    double array2[4] = {20.7, 26.4, 27.8, 31.1};
    double array3[4] = {19.1, 25.8, 27.3, 32.3};
};

構築するとき、私はこれが必要であるか、-std=c++11または-std=gnu++11働くことについての警告を受け取ります。それはうまく構築され、私が望むように機能しますが、これは、たとえばユニプロジェクトに含める場合に備えて心配する必要がありますか?

まったく同じことを行う古い代替手段がある場合ですか、それともC ++ 11からのみ可能でしたか?

4

2 に答える 2

1

(コメントで述べたように)配列からのみ読み取る場合は、を追加しconstます。

注意:値の変更を開始しないconst場合、変更を開始すると、以下は期待どおりに機能しません。

以下は私がC++03で考えることができる最高のものです。すべてをヘッダーファイルに入れることはできますが、それは良い考えではないと思います。ヘッダーと実装ファイルを使用してそれを行う方法を示します。ヘッダーにすべてが本当に必要で、次のコードを適応させる方法がわからない場合は、質問してください。

まず、ヘッダーファイルを作成しますfoo.hpp

#ifndef FOO_HPP
#define FOO_HPP

#include <string>

class ExampleClass {
private:
  const std::string (&array1)[5];
  const double (&array2)[4];
  const double (&array3)[4];

  ExampleClass(); // you need ctors to initialize the non-static members
};

#endif // FOO_HPP

ヘッダーができたので、実装ファイルを作成しますfoo.cpp

#include "foo.hpp"

namespace
{
  const std::string global_array1[5] = {"test1", "test2", "test3", "test4", "test5"};
  const double global_array2[4] = {20.7, 26.4, 27.8, 31.1};
  const double global_array3[4] = {19.1, 25.8, 27.3, 32.3};
}

// define your ctor(s)
ExampleClass::ExampleClass()
  : array1( global_array1 ),
    array2( global_array2 ),
    array3( global_array3 )
{}
于 2013-02-28T21:07:07.650 に答える
1

これは、たとえばユニプロジェクトに含める場合に心配する必要がありますか?

課題のプロジェクトを作成している場合は、課題の要件に注意を払う必要があります。コードをビルドして実行する必要のあるプラットフォーム、コンパイラ、ビルドフラグを指定する必要があります。これらの要件でC++11の使用が許可されている場合は問題ありませんが、許可されていない場合は別の方法を見つける必要があります。また、採点者が使用するプラットフォームやコンパイラなどで作業を常にテストすることを忘れないでください。

まったく同じことを行う古い代替手段がある場合ですか、それともC ++ 11からのみ可能でしたか?

まったく同じことを行うC++11以前の代替手段はありません。C ++ 11より前は、メンバー配列の初期化子を指定することはできませんでした。最も近い方法は、デフォルトの初期化を許可してから、コンストラクターで配列を再初期化することでした。

struct S {
    string array1[5];
    S() {
        string init_values[5] = {"test1", "test2", "test3", "test4", "test5"};
        for (int i=0; i<5; ++i) {
            array1[i] = init_values[i];
        }
    }
};

C ++ 11では、統一された初期化が導入されました。

struct S {
    string array1[5];
    S() : array1{"test1", "test2", "test3", "test4", "test5"}
    {}
};

そしてクラス内の初期化:

struct S {
    string array1[5] {"test1", "test2", "test3", "test4", "test5"};
};
于 2013-02-28T21:21:22.193 に答える