Forum: PC-Programmierung Klassen in eigene Datei schreiben


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von helpme91 (Gast)


Lesenswert?

Hallo zusammen,

ich benötige eure Hilfe.

Es geht um ein C++ programm.
Und zwar folgendes, wir haben ein fertiges Programm bekommen mit zwei 
Klassen usw.
Nun sollen wir die Klassen in einzelne Dateien packen.
Also für jede Klasse eine eigene Datei mit header.h

Das ist auch soweit kein Problem, nur hat er den Konstruktor außerhalb 
der Klasse definiert und da liegt mein Problem.

Was mache ich jetzt damit, kommt dieser Code nur in die .cpp oder nur in 
die header datei?

Es funktioniert einfach nicht.

Hier der Code, bei dem ich nicht weiß wohin ich deiesen tun muss.
1
Block::Block(int id, String s) {
2
  //......
3
}

von Rolf M. (rmagnus)


Lesenswert?

helpme91 schrieb:
> Was mache ich jetzt damit, kommt dieser Code nur in die .cpp oder nur in
> die header datei?

Normalerweise steckt man ihn in die .cpp-Datei.

> Es funktioniert einfach nicht.

Wie äußert sich das? Was genau hast du versucht?

von Thilo R. (harfner)


Lesenswert?

Die Implementierung (definition) des Konstruktors kommt in die .cpp 
Datei. In die .h Datei kommt die Deklaration (der Funktionsprototyp für 
den Konstruktor).

von helpme91 (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe jetzt den Code in der .cpp
Bis zum kompilieren zeigt er auch keine Fehler an.
Nach dem kompilieren kommen einige Fehlermeldungen, siehe Bild.
Zusätzlich sagt er bei allen Variablen die in:
1
Block::Block(int id, String s) {
2
  //......
3
}

stehen, nichtdeklarierter Bezeichner.

von Thilo R. (harfner)


Lesenswert?

Zeig mal bitte die (ggf. gekürzte) .h Datei und den Auschnitt der .cpp 
Datei.

Äh, die .cpp Datei enthält schon ein #include der .h Datei?

von helpme91 (Gast)


Lesenswert?

Wie sieht der Prototyp für diesen Code aus:
1
Block::Block(int id, String s) {
2
  //......
3
}

von helpme91 (Gast)


Lesenswert?

Ja, include ist drinnen.
Sonst würde ich sofort eine Fehlermeldung bekommen vor dem kompilieren.

Ich darf den Code leider nicht posten, da er nicht von mir ist.

von Der Fiese prinz (Gast)


Lesenswert?

helpme91 schrieb:
> Hallo zusammen,
>
> ich benötige eure Hilfe.
>
> Es geht um ein C++ programm.
> Und zwar folgendes, wir haben ein fertiges Programm bekommen mit zwei
> Klassen usw.
Und ihr sucht Idioten, die für euch die Hausaufgaben machen.

von helpme91 (Gast)


Lesenswert?

Ich denke es liegt nur daran, das ich in der header für:
1
Block::Block(int id, String s) {
2
  //......
3
}

keinen Prototyp habe.

von helpme91 (Gast)


Lesenswert?

@Der Fiese prinz

Falsch, ich komme nicht weiter, deshalb frage ich nach.
Schon mal daran gedacht??
Scheinbar nicht.

von Thilo R. (harfner)


Lesenswert?

Da müsste im .h so etwas stehen:

class Block
{
...
    Block(int id, String s);
...
}

: Bearbeitet durch User
von helpme91 (Gast)


Lesenswert?

Das habe ich ja auch in der header-Datei für die Klasse Block.

Nur steht der Code den ich hier schon öfters gepostet habe außerhalb der 
Klasse Block.

Deshalb ja auch: Block::Block(....) usw.

Dies muss ja bestimmt auch in der header angegeben werden?

Ich bin in diesem bereich ganz neu und mache das zum ersten Mal.

von Sebastian W. (wangnick)


Lesenswert?

helpme91 schrieb:
> Das habe ich ja auch in der header-Datei für die Klasse Block.

Dann sollte es funktioneren. So wie Thilo das beschrieben hat ist das 
genau richtig. Wenn's trotzdem nicht klappt dann liegt der Grund 
woanders ...

LG, Sebastian

von c-hater (Gast)


Lesenswert?

helpme91 schrieb:

> Ich bin in diesem bereich ganz neu und mache das zum ersten Mal.

So what? Ich musste meine Hausaufgaben auch immer selber machen. Und es 
waren immer Sachen, in deren Bereich ich ganz neu war. So ist das 
nunmal, wenn man etwas lernt.

Sozusagen ein ganz typisches Lernproblem. Und das wirst du (langfristig) 
nicht lösen, indem du dir Vollidioten suchst, die dir die fertige Lösung 
liefern.

Lerne, du faules Stück!

von Kaj (Gast)


Lesenswert?

Header:
1
#ifndef CLASS_BLOCK_H
2
#define CLASS_BLOCK_H
3
4
class Block {
5
    public:
6
        Block(int id, String s);
7
};
8
9
#endif

Cpp:
1
#include "Class_Block.h"
2
3
Block::Block(int id, String s)
4
{
5
6
}
Hast du die Dateien auch in das Buildsystem eingetragen (cmake, make, 
oder was auch immer du nutzt)?

von helpme91 (Gast)


Lesenswert?

@c-hater, halt bitte deine Fresse.

von helpme91 (Gast)


Lesenswert?

@Kaj

Genauso habe ich es gemacht.

von helpme91 (Gast)


Lesenswert?

Ich sage trotzdem mal danke an die, die versucht haben mir zu Helfen.

von Thilo R. (harfner)


Lesenswert?

Fehler 2011 heißt, für den Compiler wird da Block erneut definiert. Der 
Compiler erkennt nicht, dass
Block::Block(int id, String s) {}

die Implementierung zu
class Block {
    public:
        Block(int id, String s);
};

ist.

Mögliche Gründe:
- die Deklaration passt nicht zur Definition
ist die Signatur wirklich gleich? vielleicht einmal int und einmal long 
int?

- die Klassendefinition ist nicht abgeschlossen
kommt da ein Semikolon nach der Klasse? Únd keins nach dem Konstruktor?

von Rolf M. (rmagnus)


Lesenswert?

helpme91 schrieb:
> @Kaj
>
> Genauso habe ich es gemacht.

Umschreibe doch mal bitte nicht, wie du es gemacht hast, sondern zeige 
den tatsächlichen Code, der bei dir nicht funktioniert. Und ich meine 
nicht einen Auszug von drei Zeilen, die wahrscheinlich den Fehler gar 
nicht enthalten, sondern ein komplettes Programm, mit dem ich das bei 
mir nachvollziehen kann.
Es bringt einfach nichts, wenn dir jemand erzählt, wie du es machen 
musst, und du sagt: "Ja, genau, so habe ich es gemacht, aber es geht 
nicht". Wie soll man dir da helfen?

von Lehrer Lämpel (Gast)


Lesenswert?

Eindeutig ein Layer 8 Problem.

von helpme91 (Gast)


Lesenswert?

@ Lehrer Lämpel

Eindeutig jemand der in meinem Beitrag nicht benötigt wird.

von helpme91 (Gast)


Lesenswert?

Hallo nochmal,

das Programm funktion.
Die Lösung: Projekt neu erstellt, danach hat alles wunderbar 
funktioniert.
Ich habe den Code einfach mal auf meinem zweiten PC in ein neues Projekt 
eingefügt und da hat es sofort funktioniert.

Danach habe ich am anderen PC ein komplett neues Projekt erstellt und es 
hat funktioniert.

Die cpp und header Dateien habe ich vom alten übernommen.

Keine Ahnung, was mit dem alten Projekt nicht in Ordnung war.

Nochmals vielen Dank für die Hilfe!!

von Chris R. (ohne Login) (Gast)


Lesenswert?

Hilft zwar nur bedingt weiter, aber ich habe mir angewöhnt, bei 
mysteriösen Problemen und immer mal wieder aus Prinzip einen make clean 
durchzuführen. Da bekommt man dank Cache auch mal wieder alle warnings 
gezeigt...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.