Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Eisbär

Frischling

  • »Eisbär« ist der Autor dieses Themas

Beiträge: 5

Beruf: Schüler

  • Private Nachricht senden

1

01.02.2007, 19:39

Problem mit Mehrfacheinbindung

Also, ich habe eine .hpp-Datei mit 3 Strukturen drin und zwei Funktionen, die den Zugriff auf diese Strukturen vereinfachen sollen(ich möchte keine Klasse). Ich habe zwei Klassen, die beide diese Datei einbinden und beide in meiner main.cpp-Datei eingebunden sind.
Doch bei mir kommt immer folgender Fehler:

class CKlasse2.obj : error LNK 2005: "void __cdecl Funktion1(int &)" (?Funktion1@@YAXAAH@Z) bereits in class CKlasse1.obj definiert

und das Ganze auch noch für main.cpp

Wie kann ich das vermeiden (gibt´s da nicht auch was mit #ifndef)?

big_muff

Alter Hase

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

2

01.02.2007, 19:53

am einfachsten schreibst du an den Anfang des Headers

C-/C++-Quelltext

1
2
3
#pragma once

//[...]
Das funktioniert aber afaik nicht bei allen Compilern, gehört also nicht zum Standard. In Visual Studio wird es aber unterstützt.

Was du meinst sind Include Guards und die funktionieren so:

C-/C++-Quelltext

1
2
3
4
5
6
#ifndef IRGENDETWAS_MOEGLICHST_LANGES
#define IRGENDETWAS_MOEGLICHST_LANGES

//[...]


#endif


EDIT: once sollte doch auch blau eingefärbt werden...
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

Eisbär

Frischling

  • »Eisbär« ist der Autor dieses Themas

Beiträge: 5

Beruf: Schüler

  • Private Nachricht senden

3

01.02.2007, 20:21

Das funktioniert bei mir nicht. Den Strukturen hilfts ( bei denen hatte ich es auch vorher) aber bei den Funktionen bringt es nichts, auch keine verschachtelten Bedingungen oder so etwas in der Richtung.

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

4

01.02.2007, 20:48

Also wenn die Funktionen kurz sind dann mach sie inline, ansonsten musst du sie in eine .cpp auslagern und nur eine Deklaration im Header lassen.

5

01.02.2007, 21:16

Dann probier's mal mit

C-/C++-Quelltext

1
2
3
4
5
6
#if!defined(NAME_DER_DATEI_H)
#define NAME_DER_DATEI_H

// dein CODE


#endif

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

01.02.2007, 22:05

Zitat von »"chriss"«

Dann probier's mal mit

C-/C++-Quelltext

1
2
3
4
5
6
#if!defined(NAME_DER_DATEI_H)
#define NAME_DER_DATEI_H

// dein CODE


#endif


Nö! grek40 hat die korrekte Antwort geliefert. Die Sache ist das er die Funktionen wohl 2x definieren will. Da helfen auch keine Includeguards oder sonstwas! Wie gesagt, einfach inlinen oder die Definition auslagern!
@D13_Dreinig

Eisbär

Frischling

  • »Eisbär« ist der Autor dieses Themas

Beiträge: 5

Beruf: Schüler

  • Private Nachricht senden

7

04.02.2007, 19:30

danke, das hätte sich geklärt.
Dafür rätsele ich beim nächsten Problem:
Meine beiden Klassen sollen sich gegenseitig beinhalten, und es gibt zwei Fehlervarianten:
- entweder ich schreibe es so, dass die Klasse nicht noch einmal definiert wird (ca. 120 Fehlermeldungen für alle Namen der anderen Klasse);
- oder es kommt eine Fehlermeldung, dass die Verschachtelungsebene 362 tief wäre.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

04.02.2007, 19:40

Zitat von »"Eisbär"«

danke, das hätte sich geklärt.
Dafür rätsele ich beim nächsten Problem:
Meine beiden Klassen sollen sich gegenseitig beinhalten, und es gibt zwei Fehlervarianten:
- entweder ich schreibe es so, dass die Klasse nicht noch einmal definiert wird (ca. 120 Fehlermeldungen für alle Namen der anderen Klasse);
- oder es kommt eine Fehlermeldung, dass die Verschachtelungsebene 362 tief wäre.


Wie meinen?
@D13_Dreinig

Chase

Alter Hase

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

9

04.02.2007, 19:42

Wahrscheinlich wirst du nicht drum herum kommen Pointer zu verwenden.

C-/C++-Quelltext

1
2
3
4
5
6
class Klasse1;
class Klasse2
{
 private:
 Klasse1* pKlasse1;
// ..

So in der Richtung.

Das da nennt sich Forwaerts-Deklaration
"Have you tried turning it off and on again?"

Eisbär

Frischling

  • »Eisbär« ist der Autor dieses Themas

Beiträge: 5

Beruf: Schüler

  • Private Nachricht senden

10

04.02.2007, 20:09

also, zur Verdeutlichung:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
//Klasse1.hpp, Prototypen, Funktionen in Klasse1.cpp

#include "CKlasse2.hpp"
#include "Eigenedefines.hpp"
#if !defined CKLASSE_HPP
#define CKLASSE_HPP
class CKlasse1
{
// tu dies, jenes, sell

}
#endif


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
//Klasse2.hpp, Prototypen, Funktionen in Klasse2.cpp

#include "CKlasse1.hpp"
#include "Eigenedefines.hpp" // irgendwelche defines, für bestimmte Werte

#if !defined CKLASSE2_HPP
#define CKLASSE2_HPP
class CKlasse2
{
// tu jenes, selles, irgendebbes

}
#endif

Werbeanzeige