Problem mit Klasse!
-
Hi!
Ich habe eine Klasse "Artikel" in eine Header Datei deklariert und dann die Konstruktoren,Destruktoren und die Funktion print() in eine extra Quelldatei geschrieben.
Und die Funktion main,die vier Objekte der Klasse "Artikel" erstellt steht auch nochmal in einer Quelldatei.
Hier die Dateien:
Die Klasse in eigener Header Datei:#ifndef _ARTIKEL_ #define _ARTIKEL_ #include <string> using namespace std; class Artikel { private: long nummer; string art; double preis; public: Artikel(long k_nummer = 1111111, const string& k_art = "x", double k_preis = 1.0); ~Artikel(); void print() const; void setArt(const string& a) { art = a; } void setPreis(double p) { if (p < 0) p = 0.0; preis = p; } void setNummer(long n) { nummer = n; } const string& getArt () const { return art; } double getPreis() const { return preis; } long getNummer() const { return nummer; } }; #endif
Die Methoden in eigener Quellcodedatei:
#include <iostream> #include <iomanip> #include <c:\programme\microsoft visual studio\myprojects\lager\class.h> using namespace std; int zaehler = 0; Artikel::Artikel(long k_nummer, const string& k_art, double k_preis) { setNummer(k_nummer); setArt(k_art); setPreis(k_preis); ++zaehler; cout << "Es wird ein Objekt für den Artikel" << art << "angelegt." << endl; cout << "Dies ist der " << zaehler << "-te Artikel." << endl; } Artikel::~Artikel() { --zaehler; cout << "Das Objekt fuer den Artikel " << art << "wird zerstört" << endl; cout << "Es gibt noch " << zaehler << " Artikel" << endl; } void Artikel::print() { cout << "Artikelbezeichnung: " << art << endl; cout << "Artikelnummer: " << nummer << endl; cout << "Verkaufspreis: " << preis << endl; cout << "\n Druecken sie die Return Taste um mit dem Programm fortzufahren!" << endl; cin.get(); }
Und die Main Funktion in eigener Quellcodedatei:
#include <c:\programme\microsoft visual studio\myprojects\lager\methods.cpp> #include <c:\programme\microsoft visual studio\myprojects\lager\class.h> #include <iostream> #include <string> using namespace std; void test(); Artikel Obj1(1111, "Volleyball", 58.9); int main() { Artikel Obj2(2222, "Fußball", 25.99); Obj1.print(); Obj2.print(); cout << "Der erste Aufruf von test() " << endl; test(); cout << "Der zweite Aufruf von test() " << endl; test(); return 0; } void test() { Artikel Obj3(3333, "Handtasche", 200.5); static Artikel Obj4(4444, "Basketballkorb", 159.99); Obj3.print(); Obj4.print(); cout << "Die Funktion test() ist nun beendet" << endl; }
Aber immer wenn ich main kompilieren will kommt ein Fehler,den ich nicht verstehe:
c:\programme\microsoft visual studio\myprojects\lager\methods.cpp(27) : error C2511: 'print' : Überladene Member-Funktion 'void (void)' nicht in 'Artikel' gefunden
c:\programme\microsoft visual studio\myprojects\lager\class.h(11) : Siehe Deklaration von 'Artikel'
Fehler beim Ausführen von cl.exe.Was bedeutet das?Ich habe doch nichts überladen?Könnt ihr mir helfen?
-
hi
dein prototyp im header heißt
void print () const;
die implementierung aber
void print () {...}
es fehlt das const. ist zwingend.
desweiteren nehme den führenden unterstrich von dem include wächter weg, konstanten _HALLO_ sind dem compiler vorbehalten.. also HALLO_
und die festen pfade sind seltsam, arbeitest du nicht mit dem visual studio? der legt sich eine pfade doch in der dsp ab, da brauchst du nur
#include "class.h" schreiben, wenn der header zum projekt gehört, und mit einfachen tüttelchen.cu
-
HAbe jetzt mal das const dazugeschrieben.Trotzdem kommt noch die gleiche Meldung.Die Meldung kommt auch,wenn ich bei beiden das const weglasse.Spinnt der Compiler villeicht?
Danke für den Tip mit den Pfaden.Ich hatte da immer solche eckigen Klasmmern gemacht.Deshalb hats nie gefunzt
-
hi, also in deinem quelltext sind einige fehler enthalten.... du musst nicht den kompletten pfad beim importieren von dateien angeben dafür gibt es z.B "class.h"... darüber hinaus werden immer nur interfaces importiert und nie dir implementation => nie *.cpp Dateien.. Weiterhin solltest du das Interface immer von der Implementation trennen, es sei denn du möchtest die methoden implizit inline deklarieren.... Es reicht auch in der .h Datei den namensraum zu öffnen dadurch ist der Namensraum ebenfalls der implementation bekannt. Eigentlich sollte man den Namensraum aber nie global öffnen da es schnell zu missverständnissen beim compiler kommen kannn.. Ändere vielleicht erst mal die sachen und vielleicht läuft dann + das const dein programm...
bis denne dohan