PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verstehe G++ Fehlermeldung nicht



scar
21-03-2005, 21:18
Hi,
ich verstehe hier ne g++ Fehlermeldung nicht.
Keine Ahnung was der Compiler da will.
Ich habe eine Klasse sBone mit folgendem Code:


namespace bas
{
class sBone
{
public:
std::vector<MeshFace> faces;
unsigned int uiFaceAmount;
std::string name;
sVertex startPos;
sVertex endPos;
};
}

Und ne Klasse Mesh mit dem Code:


class Mesh

{

public:



bool loadMesh(const char* _meshFile);

unsigned int boneAmount();

const char* name;

std::vector<sBone> bones;

protected:

std::vector<param> params;

unsigned int uiParamAmount;



};


bool Mesh::loadMesh(const char* _meshFile)

{

TiXmlDocument doc(_meshFile);

if( !doc.LoadFile() )

{

std::string bla("TiXml failed to load <");

bla+=_meshFile;

bla+="> TiXml ErrorDesc: ";

bla += doc.ErrorDesc();

error("bas::Mesh", "loadMesh(const char* _meshFile)", "basMesh.h", 40, bla.c_str(), true);

}

TiXmlHandle hdCur( doc.RootElement() );

TiXmlElement* elCur = 0;



//assigning name

name = hdCur.FirstChildElement( "name" ).Text()->Value();

//assingning parameters

elCur = hdCur.FirstChildElement( "param" ).Element();

while( elCur != 0 )

{

param temp;

temp.name = elCur->Value();

temp.value = atof( elCur->Attribute( "default" ) );

params.push_back(temp);

elCur = elCur->NextSiblingElement();

}

uiParamAmount = params.size();

//assingning faces and bones

//TiXmlElement *elFace, *elVertex;

elCur = hdCur.FirstChildElement( "bone" ).Element();

while( elCur != 0)

{

sBone bone;

bone.name = elCur->FirstChildElement( "name" )->Value();

//elFace = elCur.FirstChild

}

return true;

}


Beim compilieren zeigt er mir immer einen Fehler an in der letzten while Schleife an bei der Zeile "sBone bone;" :
error: no matching function for call to bas::sBone::sBone()
error: candidates are bas::sBone::sBone(const bas::sBone&).
Dabei brauch und will ich bei der Klasse gar keinen Konstruktor.
Vor allem versteh ich nicht warum der noch nen sBone als Parameter übergibt.
Für eventuelle Nachfragen:
ist alles in der namespace bas, sVertex, param, MeshFace und die ganzen XML-Dinger sind extra Klassen.
ps.: Für Verbesserungsvorschläge bin ich immer offen :P
Danke schonmal für eure Hilfe.
Scar

locus vivendi
21-03-2005, 21:29
Ich vermute, dass sVertex keinen Default-Konstruktor hat, oder das dieser nicht rufbar ist. Probier doch mal in irgendeiner Funktion isoliert "sVertex obj;" zu schreiben, oder, alternativ zeig mal die Klasse sVertex.

scar
21-03-2005, 22:18
Ah cool danke !
Hatte nur einen Konstruktor mit parametern.
Brauchte da aber wohl einen ohne.
Hier der ist der Code der Klasse sVertex(für die, die das hier lesen und es nicht verstehen):


class sVertex
{
public:
sVertex(float _x, float _y, float _z);
sVertex();//Das hier hat gefehlt
float x,y,z;
};

inline sVertex::sVertex(float _x, float _y, float _z)
{
x=_x; y=_y;z=_z;
}

inline sVertex::sVertex()
{
//dieser konstruktor hat gefehlt!
x=0;y=0;z=0;//braucht man nicht umbedingt
}

Scar

locus vivendi
22-03-2005, 10:18
Da du ja noch nach Verbesserungsvorschlägen gefragt hattest: Ich würde vorschlagen keine Unterstriche am Anfang deiner Variablennamen zu verwenden. Einige der Namen die mit Unterstrichen beginnen sind nämlich für die C++-Implementierung reserviert. Konkret trifft das zwar nicht auf die zu, die in deinem Code-Ausschnitt zu sehen sind, aber warum ohne Not "unsicheres Terrain" betreten? Außerdem würde ich dazu raten, in den Konstruktoren Member-Initialisierungslisten zu benutzen. Das ist tendenziell effizienter und außerdem "idiomatischer".

Joghurt
23-03-2005, 13:25
Was locus meint, ist folgendes:
inline sVertex::sVertex(float x_, float y_, float z_)
: x(x_), y(y_), z(z_)
{}

cyk
23-03-2005, 16:23
Und wenn im 1. Konstruktor bei der Deklaration default-Werte benutzt werden, ist kein 2. Konstruktor (mit leerer Parameterliste) nötig.

scar
24-03-2005, 21:14
@cyk: Ich brauchte aber nen leeren Konstruktor damit das funktioniert.
@Joghurt + Locus: Hm kann schon sein das die so woanders verwendet werden, allerdings habe ich das bisher immer so gemacht das Parameter mit einem Unterstrich(_) gekennzeichnet sind.
Das macht den Code übersichtlicher und ich hatte bisher auch noch keine Probleme damit.
Scar

bischi
24-03-2005, 23:04
Da du ja noch nach Verbesserungsvorschlägen gefragt hattest: Ich würde vorschlagen keine Unterstriche am Anfang deiner Variablennamen zu verwenden. Einige der Namen die mit Unterstrichen beginnen sind nämlich für die C++-Implementierung reserviert. Konkret trifft das zwar nicht auf die zu, die in deinem Code-Ausschnitt zu sehen sind, aber warum ohne Not "unsicheres Terrain" betreten? Außerdem würde ich dazu raten, in den Konstruktoren Member-Initialisierungslisten zu benutzen. Das ist tendenziell effizienter und außerdem "idiomatischer".

Ist aber glaub ich vor allem für Klassen so ne Art Konvention...(hab ich zumindest so gelernt...)

MfG Bischi

Joghurt
25-03-2005, 00:01
Es spricht ja auch nichts gegen "x_", nur "_x" ist eben ungünstig.

bischi
25-03-2005, 01:02
Also: Ich habe folgendes gelernt (von nem theoretischen Informatik-Doktor): Für C++-Klassen werden Klasseneigene Variabeln mit _name geschrieben.

MfG Bischi

PS: Keine Ahnung, ob das allgemein gültig ist - ich finds der Übersicht halber aber noch praktisch...

locus vivendi
25-03-2005, 19:49
@Joghurt + Locus: Hm kann schon sein das die so woanders verwendet werden, allerdings habe ich das bisher immer so gemacht das Parameter mit einem Unterstrich(_) gekennzeichnet sind.
Das macht den Code übersichtlicher und ich hatte bisher auch noch keine Probleme damit.
Dann solltest du aber zumindest nachlesen welche Namen mit Unterstrich am Anfang erlaubt sind, wenn du das noch nicht getan hast.


Also: Ich habe folgendes gelernt (von nem theoretischen Informatik-Doktor): Für C++-Klassen werden Klasseneigene Variabeln mit _name geschrieben.
Das ist nur eine Konvention, keine Verpflichtung. Und gerade solange man die Regeln für Namen die mit Unterstrichen beginnen nicht so gut kennt, finde ich sollte man sie nicht verwenden. Und verbreitet scheint mir diese Konvention auch nicht zu sein - und eine Konvention für sich entfaltet halt nur dann Nutzen, wenn sie von einer ausreichenden Anzahl von Leuten benutzt wird.

bmann
25-03-2005, 21:15
Also: Ich habe folgendes gelernt (von nem theoretischen Informatik-Doktor): Für C++-Klassen werden Klasseneigene Variabeln mit _name geschrieben.
Also diese "Konvention" gilt aber allenfalls für den Code dieses Informatik Doktors, ist aber keineswegs allgemeingültig. Vielmehr sind die meisten Programmierer die ich (!) kenne (inklusive meiner Wenigkeit) der Ansicht, dass das hässlich ist. Ein m Prefix ist m.E. gebräuchlicher.
Zudem ist ein Doktor der theoretischen Informatik nicht gerade die Quell der Weisheit für eine Stil Frage der Programmierung. Theoretische Informatiker verbringen i.A. mehr Zeit mit Papier und Bleistift als mit dem Computer und sind dementsprechend oft (nicht immer!) lausige Programmierer. Ist meine Erfahrung, aber falls diese nicht reicht, kann ich auch versichern, dass ich auch (mindestens) einen Professor der theoretischen Informatik habe, der das so sagt.



Dann solltest du aber zumindest nachlesen welche Namen mit Unterstrich am Anfang erlaubt sind, wenn du das noch nicht getan hast.
Dürfte ich denn mal nachfragen wo man sowas nachlesen kann (jetzt bitte nicht "C++ Standard" antworten. Das ist mir zu teuer und ich bin grad nicht in der Nähe eine Uni Bibliothek)?
Im übrigen ist es m.E. gefahrlos derartige Parameter zu verwenden, da zum einen man nur selten gefahr läuft die belegten Namen zu benutzen. Und ... haben die internen Namen überhaupt die Möglichkeit mit Parametern in Konflikt zu geraten? Ist doch ein ganz anderer Gültigkeitsbereich oder sehe ich das falsch?
So wie ich das verstehe besteht die gefahr eigentlich nur bei globalen Variablen, die man in C++ wenn möglich gar nicht verwenden sollte. Aber wenn dann eben ohne _ Prefix :-)

(m.E. ist die Verwendung von _ als alleiniger Prefix übgrigens allgemein hässlich und sollte vermieden werden, unabhängig von möglichen internen Namen)

CU
Andi

locus vivendi
26-03-2005, 09:25
Dürfte ich denn mal nachfragen wo man sowas nachlesen kann (jetzt bitte nicht "C++ Standard" antworten. Das ist mir zu teuer und ich bin grad nicht in der Nähe eine Uni Bibliothek)?
Z.b. in diesem Artikel:
http://www.informit.com/articles/article.asp?p=360435
Oder wenn man nach "c++ reserved names" googelt, z.B. dies hier:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndeepc/html/deep04202000.asp

Im übrigen ist es m.E. gefahrlos derartige Parameter zu verwenden, da zum einen man nur selten gefahr läuft die belegten Namen zu benutzen. Und ... haben die internen Namen überhaupt die Möglichkeit mit Parametern in Konflikt zu geraten? Ist doch ein ganz anderer Gültigkeitsbereich oder sehe ich das falsch?
So wie ich das verstehe besteht die gefahr eigentlich nur bei globalen Variablen, die man in C++ wenn möglich gar nicht verwenden sollte.
Wie schon gesagt, im konkrete Fall nicht.

P.S.: Der Standard ist glaube ich immer noch über den ANSI-Webstore für 18 $ als PDF zu erhalten. Oder als Buch von Wiley für ca. 60 Euro. Das ist dann immerhin günstiger als die gedruckte Ausgabe der Normierungsorganisationen.

P.P.S.: Ich möchte ja niemanden in die Illegalität verleiten, aber wer es wirklich will kommt natürlich auch für 0 Euro an die PDF ran...