0

クラスにポインタの配列が必要です。これは私が試したコードです。しかし、エラーが発生します。

class Msg{
    public:
      char *msg[2]={
                   "one",
                   "two",
                    "three"
                 };

//there are some other methods I want to write.....
 };


void main(){
     Msg msg;
//  i want to print msg[] here using a for loop
}

しかし、コンパイルされず、クラスでエラーが表示されます。また、クラスメンバーであるポインタの配列にアクセスする方法も知りたいです。間違っている場合は構文を修正してください。

edit:[i want to do]

状況に応じて表示される約12の固定メッセージがあります。列挙型を設定して、のように正しいインデックスを取得します。

enum{
    size,
    area,
    volume,
    //etc 

};

class Msg列挙型を渡すときにmsgputMsg(int index)を必要とする関数があります。cout私が合格areaすると、「あなたの方程式によって計算された面積は:」のようなメッセージが表示されます。このタイプのメッセージングを行うためのより良い方法はありますか。

4

3 に答える 3

6

これを試して:

class Msg{
    public:

      // Can not initialize objects in the declaration part.
      // So just provide the declaration part.
      static char const *msg[];

      // Note: You had the completely wrong size for the array.
      //       Best to leave the size blank and let the compiler deduce it.

      // Note: The type of a string literal is 'char const*`

      // Note: I have made it static so there is only one copy.
      //       Since the strings are literals this should not affect usage
      //       But if you wanted one per class you need another technique.


    //there are some other method i want to write.....
};

// Now we can provide a definition.
// Note: I still leave the size blank and let the compiler deduce the size.
      char const* Msg::msg[]={
                   "one",
                   "two",
                    "three"
                 };  


// Note: main() must return an int.    
int  main(){
     Msg msg;
//  i want to print msg[] here using a for loop


    // The basic way
    for(std::size_t loop = 0;loop < sizeof(Msg::msg)/sizeof(Msg::msg[0]); ++loop)
    {
        std::cout << Msg::msg[loop] << "\n";
    }

    // Same as above but using C++11
    for(auto loop = std::begin(Msg::msg); loop != std::end(Msg::msg);++loop)
    {
        std::cout << *loop << "\n";
    }

    // using algorithms:
    std::copy(std::begin(Msg::msg), std::end(Msg::msg), std::ostream_iterator<char *const>(std::cout, "\n"));



     // Note: You don't actually need a return statement in main().
     //       If you don't explicitly provide one then 0 is returned.

}
于 2012-08-13T16:36:24.900 に答える
2

これは、ポインタの配列(BTWを使用するのは特に良いことではありません、検討してくださいstd::vector<std::string>)であるということとはほとんど関係ありませんが、初期化しようとしている方法とは関係ありませんmsg。これは(非静的)メンバー変数であるため、宣言された場所ではなく、クラスのコンストラクターで初期化する必要があります。

class Msg{
    public:
      char *msg[3];

      Msg()
        : msg{ "one"
             , "two"
             , "three" }
      {}

//there are some other method i want to write.....
 };
于 2012-08-13T16:29:52.810 に答える
0

疑わしいですが、 「初期化エラーが多すぎます」というエラーが発生していることを(実際のエラーを投稿していないので)確実に言うことはできません。

に変更*msg[2]*msg[3]ます。または、空白のままにします。[]

または「3」を削除します。

于 2012-08-13T16:33:26.320 に答える