使用其他成员初始化结构的成员吗?

时间:2018-08-15 20:56:38

标签: c++ struct constructor initialization parameter-passing

我想知道是否可以创建一个结构,并使用在结构中初始化的成员/变量作为参数来构建其他成员。例如,我想构建一个结构:

struct myStruct {
    size_t length;
    std::string (&strings)[length]; // from the above variable
};

类似这样的事情。而且我知道初始化顺序有些细微之处,但是我敢肯定,可以解决一些问题(可能是构造函数?)来解决该问题。目前,我发现可行的唯一方法是模板:

template <size_t N>
struct myStruct {
    int length;
    std::string (&strings)[N]; // from the template parameter
};

请记住,我实际上将我的length值作为结构体中的成员变量传递,因此理想情况下,我不需要模板。

修改
澄清:我只需要访问数组的字符串并能够从中读取(无需覆盖它们,因此const可以并且应该使用)就像使用常规数组一样:基于[]符号。我也可以容忍对std::array的更改。无论如何,我只需要以与常规用法完全不同的方式容易地访问字符串。另外,它必须来自结构指针(又称箭头运算符)。

非常感谢!

1 个答案:

答案 0 :(得分:5)

您不得使用

struct myStruct {
    size_t length;
    std::string (&strings)[length];
};

因为length不是编译时间常数。

您最好的选择可能是使用std::vector<std::string>&

struct myStruct {
    // Assuming you were using a reference on purpose.
    std::vector<std::string>& strings;
};

并在构造函数中对其进行初始化。

struct myStruct {
    myStruct(std::vector<std::string>& in) : strings(in) {}
    std::vector<std::string>& strings;
};

如果在编译时知道数组的大小,则有两种选择。

  1. 使用std::string s的常规数组。

    template <size_t N>
    struct myStruct {
        int length;
        std::string (&strings)[N];
    };
    
  2. 使用std::array中的std::string

    template <size_t N>
    struct myStruct {
        int length;
        std::array<std::string, N>& strings;
    };
    

第二个选项更好,因为std::array具有常规数组所具有的所有功能以及更多功能。