初始化 C++ 中的结构数组

Initialization of an array of structs in C++

本文关键字:结构 数组 C++ 初始化      更新时间:2023-10-16

如果我有一个像下面这样的结构:

typedef struct MyStruct {
    char **str;
    int num;    
} MyStruct;

有没有办法让我初始化这个结构的数组。也许像下面这样:

const MyStruct MY_STRUCTS[] = {
    {
        {"Hello"}, 
        1
    },
    {
        {"my other string"}, 
        3
    },
};

最终,我希望在C++类中不断声明结构数组。如何做到这一点?是否可以有一个预先初始化的私有声明成员?

当然,你会这样写:

#include <string>
#include <vector>
struct MYStruct
{
     std::vector<std::string> str;
     int num;
};
MyStruct const data[] = { { { "Hello", "World" }, 1 }
                        , { { "my other string" }, 3 }
                        };

除非我误会了,你实际上只想num计算元素的数量。然后你应该只有:

std::vector<std::string> data[] = { { "Hello" }
                                  , { "my", "other", "string" }
                                  };

您可以使用data[0].size()data[1].size()等恢复元素大小。


如果一切都是静态确定的,而你只需要一个紧凑的引用,你仍然需要提供存储,但一切都与 C 中的几乎相同:

namespace    // internal linkage
{
    char const * a0[] = { "Hello" };
    char const * a1[] = { "my", "other", "string" };
    // ...
}
struct Foo
{
    char const ** data;
    std::size_t len;
};
Foo foo[] = { { a0, 1 }, { a1, 3 } };

由于大小是 std::distance(std::begin(a0), std::end(a0)) ,您可以使用仅将a0作为参数的宏来简化最后一部分。而不是手写Foo,你可能只使用std::pair<char const **, std::size_t>

你的意思是这样的:

在某些头文件中:

class X
{
  private:
    static const MyStruct MY_STRUCTS[]; 
};

在某个.cpp文件中:

const X::MyStruct MY_STRUCTS[] = { { {"Hello"}, 1}, { "Other String"} , 3 } }; 

然而,这假设你有一个char *str;,因为char **str;需要一个辅助变量来取下地址。或者,您可以使用 std::vector<string> ,这将解决问题。

你可以使用类似的东西

class foo {
    MyStruct array[2];
public:
    foo()
        : array{ { "a", 1 }, { "b", 2 }}
    {
    }
};

假设您struct的第一个成员实际上是char const*的,而不是像初始化示例建议的那样char**