Foo наследует std::array<int, 2>
. Возможно ли заполнить массив в списке инициализации конструктора Foo?Шаблон инициализации в списке инициализации производного конструктора
Если да, то что было бы допустимой альтернативой синтаксису ниже?
// Foo is always an array of 2 ints
struct Foo: std::array<int, 2>
{
Foo() {}
Foo(const int & x, const int & y) : std::array<int, 2> { x, y } {}
}
Я попытался добавить дополнительную пару скобок, которая работает на г ++, но не на VC2015 компилятором:
#include <array>
#include <iostream>
struct Foo : std::array<int, 2>
{
Foo() {}
Foo(const int & x, const int & y) : std::array<int, 2> {{ x, y }} {}
};
int main()
{
Foo foo(5, 12);
std::cout << foo[0] << std::endl;
std::cout << foo[1] << std::endl;
system("PAUSE");
}
и получил следующие ошибки: https://i.gyazo.com/4dcbb68d619085461ef814a01b8c7d02.png
Почему 'Foo' наследует от' станд :: array'? –
В моем приложении это будет класс point/vector с функциями GetX() SetY() и т. Д. Для меня это имеет больше смысла, чем структура с элементами данных x, y, z, поскольку это позволяет мне удалять повторяющийся код для каждого измерения , –
Это, безусловно, зависит от вас, как вы разрабатываете вещи. Но я скажу, что наследование не лучший инструмент для большинства заданий (http://blog.codinghorror.com/inherits-nothing/, и, в отличие от C#, большая часть стандартной библиотеки C++ не предназначена для наследования с). Хотя вы можете наследовать от 'std :: array', обратите внимание, что у него нет функций' virtual', что означает, что вы почти никогда не будете взаимодействовать с вашим 'Foo' с помощью указателя или ссылки std :: array'; но это нормально, потому что деструктор 'std :: array' не является виртуальным, поэтому вам нужно знать, что у вас действительно есть« Foo », когда вы уничтожаете свой объект. –