2016-04-08 4 views
0

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

+1

Warum 'foo' erben von 'std :: array'? –

+0

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 . –

+1

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. –

Antwort

2

Ja, Sie brauchen nur ein zusätzliches Paar von Klammern:

struct Foo: std::array<int, 2> { 
    Foo() {} 
    Foo(const int & x, const int & y) : std::array<int, 2> {{ x, y }} {} 
                 ^ ^
}; 

Live Demo

Für VC++ Compiler Sie werden anstelle von Klammern ein Paar Klammern müssen:

struct Foo : std::array<int, 2> { 
    Foo() {} 
    Foo(const int & x, const int & y) : std::array<int, 2>({ x, y }) {} 
                 ^ ^
}; 
+0

Leider funktioniert das nicht; Bitte sehen Sie meine bearbeitete Frage. EDIT: In VS2015 –

+0

Vielen Dank! Dein letzter Schnitt funktioniert einwandfrei. Markierung als gelöst. –