2010-11-23 11 views
6

ich zusammen mit der Ausgabe OpenGL Super-Bibel 5. folgende bin, und sie definieren einen Vektor (Vektor, wie in der Mathematik) alsIch brauche Hilfe um ein Array zu einem Vektor in C++ Hinzufügen

typedef float M3DVector3f[3]; 

Ich versuche, eine Instanz dies zu einem std :: vector (das 're ansehnliche Array' in C++) hinzuzufügen, jedoch halte ich erhalte eine Fehlermeldung sagen:

array initialization needs curly braces 

Full Error

die Art, wie ich die std definiert: : Vektor und die Art, wie ich bin ding ist:

std::vector<M3DVector3f> vertices; 

float vertex[3]; 
sscanf_s(line.c_str(), "%*s %f %f %f", &vertex[0], &vertex[1], &vertex[2]); 

M3DVector3f v = {vertex[0], vertex[1], vertex[3]}; 

vertices.push_back(v); 

ich, dass das Problem gesammelt habe mit dem vertices.push_back (v) Anruf ist, weil ich nicht einen Fehler, wenn ich das Kommentar aus. Könnte mir jemand erklären und mir helfen herauszufinden, warum ich diesen Vektor nicht zu meinem Vektor hinzufügen kann?

+1

+1 für schön formatiert Frage – Chubsdad

+0

Ich möchte nur Sag Danke an alle, die mir geholfen haben. Ich nahm GMans Ratschlag an und erstellte eine neue Klasse für alle meine Vektoren. Das hat viel besser funktioniert, weil ich die Operatoren überlasten konnte, so dass mein Code nun sauber und aufgeräumt aussieht. :) – krej

Antwort

4

Arrays können nicht (direkt) kopiert oder zugewiesen werden, und bei Standardcontainern müssen Typen kopierbar und zuweisbar sein.

Sie können jedoch (und wahrscheinlich sollte) tun dies statt:

struct M3DVector3f // a basic vector class 
{ 
    float x; 
    float y; 
    float z; 
}; 

Welche ist kopierbar und ebenso verwendbar.

+0

Es ist auch lesbarer, da es zeigt, was jede Komponente darstellt. –

+0

Warum gibt die Implementierung keinen Fehler beim Deklarieren von 'Vertices', wenn sie die Anforderungen des Containers nicht erfüllt? – Chubsdad

+0

@Chubsdad: Weil es nicht muss. Die Verwendung dieser Anforderungen erfolgt erst bei der Instanziierung der Funktionen, die sie verwenden. (Dies ist in C++ 0x noch wichtiger, wo die Elementanforderungen auf einer Funktion basieren.) – GManNickG

1

Für den Anfang sollte Vertex [3] oben Vertex [2] sein, da Vertex [3] außerhalb der oberen Grenze des Arrays liegt. Das ist jedoch nicht der Kern des Problems. Die Template-Instantiierung des Vektors erfolgt mit einem Array-Typ. Es gibt keinen standardmäßigen Kopierkonstruktor als solchen für Array-Typen, die eine Kopie ausführen, die tiefer ist als die einfache Zeigerkopie. Sie können feststellen, dass dies funktioniert besser, wenn Sie stattdessen versuchen:

std::vector<M3DVector3f*> vertices; 
M3DVector3f* v = new M3DVector3f; 

sscanf_s(line.c_str(), "%*s %f %f %f", &((*v)[0]), &((*v)[1]), &((*v)[2])); 

vertices.push_back(v); 

Es gibt eine andere sein kann, elegantere Lösung intelligente Zeiger unter Verwendung jeden Eintrag in dem Vektor zu bereinigen, wenn Sie gehen, um es später zu zerstören. :-)

+0

Ich habe das versucht, aber die Verwendung der "neuen" gibt mir diesen Fehler: kann nicht konvertieren von 'float *' zu 'M3DVector3f (*)' – krej

0

Klärende ein bisschen auf GMan Antwort über

Der folgende Code führt auch den gleichen Fehler wie Sie haben, während ein push_back tun.

typedef float MYBUF[3]; 

int main(){ 
    MYBUF m1; 

    MYBUF m2(m1);  // Same Error as in OP 
} 

Dies ist genau das, was der Vektor :: push_back tut mit jedem T. durch die Sprache C++ ist nicht erlaubt Es wird versucht, eine Kopie (und daher der Begriff kopierbar) des Eingabeargument und eine solche Kopie zu machen, Array-Typen.

0

nicht sicher, wie gut es Ihnen passen, aber man konnte mit etwas weniger direkte Lösung experimentieren, wie die folgenden (die ohne Fehler kompiliert):

#include <iostream> 
#include <vector> 

typedef float M3DVector3f[3]; 

struct X 
{ 
    X(M3DVector3f& p) { x_[0] = p[0]; x_[1] = p[1]; x_[2] = p[2]; } 
    operator M3DVector3f&() { return x_; } 
    M3DVector3f x_; 
}; 

int main() 
{ 
    M3DVector3f v = { 1, 2, 3 }; 
    std::vector<X> xs; 
    xs.push_back(v); 
} 
Verwandte Themen