Foo erbt std::array<int, 2>
. Ist es möglich, das Array in der Initialisierungsliste von Foo's Konstruktor zu füllen?Initialisierungsvorlage in der Initialisierungsliste des abgeleiteten Konstruktors
Wenn ja, was wäre eine gültige Alternative zur folgenden Syntax?
// 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 } {}
}
Ich habe versucht, ein zusätzliches Paar von Klammern hinzugefügt, die auf g ++ arbeitet, jedoch nicht auf dem VC2015 Compiler:
#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");
}
und bekam folgende Fehler: https://i.gyazo.com/4dcbb68d619085461ef814a01b8c7d02.png
Warum 'foo' erben von 'std :: array'? –
In meiner App wird es eine Punkt/Vektor-Klasse mit GetX() SetY() - Funktionen usw. Für mich macht dies mehr Sinn als eine Struktur mit x, y, z Datenelementen, weil es mir erlaubt, wiederholten Code für jede Dimension zu entfernen . –
Es liegt natürlich an Ihnen, wie Sie Dinge gestalten. Aber ich werde sagen, dass Vererbung nicht das beste Werkzeug für die meisten Jobs ist (http://blog.codinghorror.com/inherits-nothing/, und im Gegensatz zu C# ist der Großteil der C++ - Standardbibliothek nicht wirklich darauf ausgelegt, vererbt zu werden). Während Sie von 'std :: array 'erben können, beachten Sie, dass es keine' virtuellen' Funktionen hat, was bedeutet, dass Sie fast nie mit Ihrem 'Foo' über einen' std :: array' Zeiger oder Verweis interagieren; aber das ist in Ordnung, weil 'std :: array's Destruktor nicht virtual ist, also müssen Sie wissen, dass Sie wirklich ein' Foo' haben, wenn Sie Ihr Objekt zerstören. –