【问题标题】:Initializing members of a struct using other members?使用其他成员初始化结构的成员?
【发布时间】:2018-08-15 20:56:37
【问题描述】:

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

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。无论如何,我只需要以与常规用法没有明显不同的方式轻松访问字符串。此外,它必须来自 结构指针(也称为箭头运算符)。

非常感谢!

【问题讨论】:

  • 不幸的是,您为您的问题选择了一个不好的例子。一般来说,您的问题的答案是肯定的,但在您的具体示例中它不是,因为数组的长度必须是编译时间常数。另外,我不确定您期望 std::string (&amp;strings)[N] 是什么,但如果它是一个引用数组,那么这也是非法的。
  • @NathanOliver 字符串数组?我需要能够通过 ((struct myStruct *) structptr-&gt;strings)[15] 或类似的指针来使用该特定的结构成员。我不太熟悉。
  • 如果你想要一个字符串数组,你应该使用std::array&lt;std::string, SIZE&gt; - 注意这里没有引用。
  • 哦,你想要一个字符串数组的引用,明白了。我在想你正在尝试对字符串进行引用。
  • 而且,如果您想要对字符串数组的引用,请记住,虽然允许,但将引用作为类成员,但不一定是最好的主意。使用(非拥有)指针可能会更好

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


【解决方案1】:

你不能用

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

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

您最好的选择可能是使用std::vector&lt;std::string&gt;&amp;

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::strings 的常规数组。

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

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

第二个选项更好,因为std::arrays 拥有常规数组所拥有的一切以及更多。

【讨论】:

  • 是的,我想。模板是最好的方法吗?
  • 假设你想要引用一个字符串数组,一个大小模板参数是唯一的方法。
  • @JonathanLee,我不知道什么最适合您的需求,数组(必须在编译时知道其大小)或 std::vector(其大小可以在运行时确定时间)。如果是数组,那么是的,使用模板是最好的方法。
  • 我认为std::array 可能是要走的路。我刚刚运行了一个测试程序,它工作正常。如果您添加那个小脚注,我会接受您的回答。
  • @JonathanLee,你明白了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-23
相关资源
最近更新 更多