PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Headerdatei mit Klasse, einbinden: Konstruktor tuts nicht



chrisch
04-02-2005, 18:00
Hallo,

Ich habe mal versucht an einem kleinen Beispiel eine selbstdefinierte Headerdatei einzufügen.

Leider funktioniert das mit dem Konstruktor nicht so, wie ich mir das vorstelle.
Anstatt 10 auszugeben, wird 0 ausgegeben.

Hier meine Dateien:

test.H

class test{
public:
double x;
};
test.C

#include "test.H"
class test{
public:
test(){ //Konstruktor
x=10;
};
};
main.C

#include <iostream>
#include "test.H"
using namespace std;
int main(){
test t=test();
cout<<t.x<<endl; //Ausgabe
}

Kompiliert wird mit g++
Vielen Dank schonmal, wenn jemand helfen kann,
Chris

locus vivendi
04-02-2005, 18:22
Du bindest nur die Klassendefinition aus der Header-Datei ein. Die enthält aber keinen benutzerdefinierten Konstruktor. Du kannst auch keine Klassendefinitionen neu öffnen, falls das ist was du in deiner test.C bezweckst. Du kannst grob gesagt nur Elemente (statische und nicht statische sind gemeint) der Klasse definieren.

Das sind aber alles Grundlagen die man am besten nachlesen sollte.

chrisch
04-02-2005, 20:51
Ok, da hab ich einiges durcheinander gebracht.

Hab jetzt noch mal in Ruhe nachgeschaut, so funktionierts jetzt (EDIT leider doch nicht...):

test.H

class test{
public:
test(); //Konstruktor
double x;
};

test.C

#include "test.H"
test::test(){ //Konstruktor
x=10;
};
};

EDIT: Mist zu früh gefreut, wenn ich in meiner main.C den Konstruktor aufruf

test t;
kommt der Fehler

: undefined reference to `test::test[in-charge]()'
collect2: ld returned 1 exit status
Man des gibts doch net, ich find den Fehler nicht! Im Prinzip muss doch alles stimmen?

`kk
04-02-2005, 22:43
Sorry, ich fang auch grad erst mit C++ so richtig an aber hast du test.h in main.cpp eingebunden?

Gruß, Kai.

peschmae
05-02-2005, 06:36
das und


#include "test.H"
test::test(){ //Konstruktor
x=10;
};
};

hiesse besser


#include "test.H"
test::test(){ //Konstruktor
x=10;
}


Ausserdem würde ich die .C und .H nicht in grossbuchstaben schreiben. Das macht sonst keiner und sorgt so nur für verwirrung (bei anderen).

MfG Peschmä

wraith
05-02-2005, 08:31
Das Problem ist, du hast du test.C nicht kompiliert, und damit fehlt dem Linker die Definition deines Konstruktors.
Weil du test.C nicht kompiliert hast, werden auch die Fehler, auf die peschmae hingewiesen hat nicht angezeigt.

Also:
g++ -W -Wall -std=c++98 -pedantic main.C test.C



Ausserdem würde ich die .C und .H nicht in grossbuchstaben schreiben. Das macht sonst keiner und sorgt so nur für verwirrung (bei anderen).

An der Endung *.C erkennt der gcc aber, ob es sich um C (hier dann ein kleines *.c) oder C++ handelt.
Besser aber gleich statt *.C verwendest du *.cpp, das ist die übliche Endung.

`kk
05-02-2005, 11:32
Ausserdem würde ich die .C und .H nicht in grossbuchstaben schreiben. Das macht sonst keiner und sorgt so nur für verwirrung (bei anderen).
Hi.
Bei fltk sind die Header auch in der Form.
Also zum Beispiel Fl_Window.H, aber naja.. ich find das auch nich so gut. :)

chrisch
05-02-2005, 14:00
Ok, super Leute, vielen Dank! :)

Die Dateiendungen sind deshalb *.C und *.H, weil die Dateien in dem Programmpaket in dem ich was änder diese Endungen haben.

Also danke nochmal!

peschmae
05-02-2005, 19:58
Besser aber gleich statt *.C verwendest du *.cpp, das ist die übliche Endung.

Stimmt. Das ist ja C++ :D

@`kk: Fltk sind doch die mit dem cxx oder verwechsle ich da was? ;)

MfG Peschmä

`kk
05-02-2005, 21:47
Ja stimmt, die Endung ist dort auch *.cxx.
Die machen wohl alles anders. :D

Hab ich mir letztens auf meinen Streifzügen angeguckt.
Suche aber immer noch mein Toolkit. ;)