c ++自定义类型数组initialiazion

时间:2016-09-11 22:33:14

标签: c++ arrays

如果我有:

    Class SomeClass{
    private:
        int a;
        char* name;
    public:
        SomeClass(int a = 0, char* n = "---"){
           ...
        }
    };

    Class OtherClass{
    private:
    SomeClass anArray[100];
    int counter;
    ...
    public:
        ...
    };

如何初始化SomeClass类型的数组?据我所知,当你有一个属于用户定义类的私有成员时,要初始化它你应该把它包含在构造函数中

    OtherClass(...):SomeClass(...){
       ...
    }

但是,数组的内容留待用户输入,因此它们太难以预测,并且显然无法为每个字段手动输入默认值。

1 个答案:

答案 0 :(得分:0)

鉴于你的SomeClass有一个默认构造函数,你不需要任何东西:默认构造函数将调用每个元素。你想明确提一下它可以用

OtherClass::OtherClass()
    : anArray() {
}

如果要使用显式构造函数调用初始化元素序列并将其键入,则可以使用委托构造函数,使用适当大小std::index_sequence<...>并使用元素的聚合初始化。以下是完整的示例:

#include <iterator>
#include <algorithm>
#include <iostream>

struct S {
    int value;
    S(int value): value(value) {}
};
std::ostream& operator<< (std::ostream& out, S const& s) {
    return out << s.value;
}

template <typename S, typename T, std::size_t Size>
constexpr std::size_t static_size(T (S::*)[Size]) {
    return Size;
}

class T {
    S array[100];
    template <std::size_t... I>
    T(std::index_sequence<I...>): array{ S(I)... } {}
public:
    T(): T(std::make_index_sequence<static_size(&T::array)>()) {}
    S const* begin() const { return std::begin(array); }
    S const* end() const   { return std::end(array); }
};

int main()
{
    T t;
    std::copy(t.begin(), t.end(), std::ostream_iterator<S>(std::cout, " "));
}