PDA

Tam Sürümünü Görmek İçin : class1.cpp dosyası include etmek


ankakusu
06/10/2007, 10:24
Merhaba,
ben bir şeyi merak ediyorum.

Mesela attaki gibi bir programım var:


//class1.h dosyası
class class1
{
public:
class1();
virtual ~class1();

private:

};




//class1.cpp

#include "class1.h"

class1::class1()
{

}

class1::~class1()
{

}


//main.cpp
#include <iostream>
using namespace std;

#include "class1.cpp"


int main(int argc, char* argv[])
{
printf("Hello World!\n");
class1 abc;
return 0;
}

eğer dikkat ederseniz main fonksiyonunda

#include "class1.cpp"

dedim. header dosyayı
çağırmak yerine...
ama hata verdi. Bunun nedenini bilen var
mı acaba?

verdiği hata:

Compiling...
chap6.cpp
Linking...
class1.obj : error LNK2005: "public: __thiscall class1::class1(void)" (??0class1@@QAE@XZ) already defined in chap6.obj
class1.obj : error LNK2005: "public: virtual __thiscall class1::~class1(void)" (??1class1@@UAE@XZ) already defined in chap6.obj
Debug/chap6.exe : fatal error LNK1169: one or more multiply defined symbols found
Error executing link.exe.

chap6.exe - 3 error(s), 0 warning(s)


Euclides
06/10/2007, 10:43
2 tane class1 tanımlıyorsun. 1 tanesi main.cpp'de diğeri ise class1.cpp'de. Şimdi "class1" denildiğinde hangi class1'in anlaşılması lazım ??? burada muğlak bir durum oluşuyor.
"already defined in chap6.obj" hatası bunu gösteriyor.
Bir nevi 2 tane aynı isimde global değişken tanımlamak gibi.

ankakusu
06/10/2007, 11:31
ben olayı tam anlayamadım.

main.cpp'de nerede tanımladım class1?

Euclides
06/10/2007, 12:57
"#include"'un anlamı "kopyala & yapıştır"'dır. class1.cpp'i kopyala main.cpp'deki "#include" satırına yapıştır.
class1.cpp'de
class1::class1() var
main.cpp'de
gene
class1::class1() var

hangisi class1'in constructor'ı ?

myavuzselim
06/10/2007, 13:21
Editorun derleyiciye class1.cpp'yi de derletip linkletiyordur. Bir sekilde (mesela komut satirindan) sadece main.cpp'yi derlersen sorun cikmamasi lazim.

ankakusu
06/10/2007, 13:45
hmm şimdi anladım.

teşekkür ederim...