error LNK2005

09/18/2014 18:58 Terrat#1
Hey,
ich könnt .... langsam .....
Problem:
Ich schreibe eine Klasse siehe:
Code:
class DPK_Stream{
	public:
		void Reset();
		DPK_Stream(){Reset();}
		
		void StartStreamThread();

};



void DPK_Stream::Reset()
{

}
void DPK_Stream::StartStreamThread()
{

}
Spuckt der compiler mir das hier aus:
Code:
1>MusicStream.obj : error LNK2005: "public: void __thiscall DPK_Stream::Reset(void)" (?Reset@DPK_Stream@@QAEXXZ) ist bereits in main.obj definiert.
1>MusicStream.obj : error LNK2005: "unsigned long __stdcall PlayAudio(void *)" (?PlayAudio@@YGKPAX@Z) ist bereits in main.obj definiert.
1>MusicStream.obj : error LNK2005: "public: void __thiscall DPK_Stream::StartStreamThread(void)" (?StartStreamThread@DPK_Stream@@QAEXXZ) ist bereits in main.obj definiert.
09/18/2014 19:26 Padmak#2
Die Implementationen auslagern in eine cpp-Datei, und außenrum noch entweder #pragma once (zwar nicht Standard, aber wird eh meist unterstützt) oder einfache #ifdef-Blöcke.
Dann wars das

Padmak
09/19/2014 14:28 Terrat#3
Quote:
Originally Posted by Padmak View Post
Die Implementationen auslagern in eine cpp-Datei, und außenrum noch entweder #pragma once (zwar nicht Standard, aber wird eh meist unterstützt) oder einfache #ifdef-Blöcke.
Dann wars das

Padmak
Selber Error:
MusicStream.cpp
Code:
#ifndef __DPK_STREAM_CPP
#define __DPK_STREAM_CPP
class DPK_Stream
{
  public:                              // öffentlich
	void Reset();
	void StartStreamThread();
  private:                             // privat
    int m_eineVariable;
};



void DPK_Stream::Reset()
{

}

void DPK_Stream::StartStreamThread()
{
	
}
#endif //__DPK_STREAM_CPP
09/19/2014 14:45 ƬheGame#4
Code:
#ifndef __DPK_STREAM_CPP
#define __DPK_STREAM_CPP

namespace musicstreamstuff
{
class DPK_Stream
{
  public:                              // öffentlich
	void Reset();
	void StartStreamThread();
  private:                             // privat
    int m_eineVariable;
};

void DPK_Stream::Reset()
{

}

void DPK_Stream::StartStreamThread()
{
	
}
#endif //__DPK_STREAM_CPP
}
Sieht so aus als würde es die definition 2x geben, einfach namespace verwenden und ihm einen gescheiten Namen geben. Wenn es nur darum geht eine variable über 2 cpp files zu sharen kannst du auch "extern" verwenden. Gibt genug dazu bei google.
09/19/2014 14:59 Padmak#5
Oder er macht es richtig.
Die Klassendefinition muss in eine getrennte Header-Datei (MusicStream.h), die Implementation in die Source-Datei (MusicStream.cpp)
Leg dir mal ein ordentliches Buch zu, solche Sachen müsstest du mittlerweile schon wissen

Padmak
09/19/2014 15:13 ƬheGame#6
Quote:
Originally Posted by Padmak View Post
Oder er macht es richtig.
Die Klassendefinition muss in eine getrennte Header-Datei (MusicStream.h), die Implementation in die Source-Datei (MusicStream.cpp)
Leg dir mal ein ordentliches Buch zu, solche Sachen müsstest du mittlerweile schon wissen

Padmak
Sehe es grade habe gar nicht gesehen, dass die Methoden direkt unter der Klassendefinition stehen ^^ C++ Primer soll ganz gut sein.
Man kann aber auch Namespace verwenden, wenn die Definition und die Implementation in unterschiedlichen Files sind was man bei großen Klassen auch machen sollte ;)
09/19/2014 15:14 th0rex#7
Edit: Missverständnis sry. Du hast davon gesprochen das man große Klassen in unterschiedliche Files aufteilen sollte. Habs so verstanden das große Klassen in nen Namespace sollen... Sry.

Ich würde sogar immer namespaces verwenden, damit der globale namespace nicht zugemüllt wird.