2016-03-30 12 views
0

** SORUN GİDERME. Yanlışlıkla fazladan bir başlık yaratmışım ve onu sildimden beri işe yaradı. **Sınıflar ve üstbilgileri anlamak için yordam

Bu yüzden dersleri ve başlıkları ve bunları birlikte nasıl çalıştırabileceğimi anlamaya çalışıyorum. Çevrimiçi bir eğiticiyi takip ediyorum ancak kodumda bir şeyler ters gidiyor gibi görünüyor. Sorun şu ki, bu hata main'u çalıştırmayı denediğimde, bu hatayı verir: Cat::speak()'un birden çok tanımı ve diğer tüm işlevler.

main.cpp

#include <iostream> 
#include "class.h" 
using namespace std; 

int main() 
{ 
    Cat jim; 
    jim.makehappy(); 
    jim.speak(); 

    Cat george; 
    george.makesad(); 
    george.speak(); 

    return 0; 
} 

class.cpp

#include <iostream> 
#include "class.h" 
using namespace std; 

void Cat::speak() 
{ 
    if (happy) 
    { 
     cout << "meoww" << endl; 
    } 
    else 
    { 
     cout << "sssss" << endl; 
    } 
} 

void Cat::makehappy() 
{ 
    happy = true; 
} 

void Cat::makesad() 
{ 
    happy = false; 
} 

class.h

#ifndef CLASS_H_INCLUDED 
#define CLASS_H_INCLUDED 

class Cat 
{ 
private: 
    bool happy; 
public: 
    void makehappy(); 
    void makesad(); 
    void speak(); 
}; 

#endif // CLASS_H_INCLUDED 
+3

Kodunuzu nasıl derliyorsunuz? ya da daha ziyade, bağlama sırasında class.cpp'yi bir kereden fazla kullanmanız gibi görünüyor. – marcinj

+0

ama 'error: multiple definition' linker problemlerini göstermez .. – marcinj

+2

Kodunuzu denedim ve derleme veya bağlantı hataları olmadı. Nasıl inşa ediyorsun Gnu derleyici ve kod engellerini kullanarak –

cevap

1

nasıl kod derleme? Belirli "class.o" ve "main.o" dosyalarını bir araya getirmeden önce ayrı ayrı oluşturduğunuzdan emin olmanız gerekir. İşte bir örnek Makefile.

all: main 

main: main.o class.o 
    g++ main.o class.o -o main 

main.o: main.cpp class.h 
    g++ -c main.cpp 

class.o: class.cpp class.h 
    g++ -c class.cpp 

Çifte içerme korumalarını kullanıyorsunuz, bu yüzden sorun olduğunu düşünmüyorum. Olanlar hakkında daha ayrıntılı bir açıklama için bu cevabı gözden geçirin: Error with multiple definitions of function

1

Burada gösterilenlerden hiçbir sorun çıkarılmamalıdır. Bu işlevi birkaç yerde gerçekten tanımlayıp tanımlamadığınızı öğrenmek için bunu geçici olarak çözmek için neler yapabileceğinizi, sınıfınızı bir ad alanına kaydırmaktır.

class.h

#ifndef CLASS_H_INCLUDED 
#define CLASS_H_INCLUDED 

namespace myNamespace { 

class Cat { 
private: 
    bool happy; 
public: 
    void makehappy(); 
    void makesad(); 
    void speak(); 
}; 

} // namespace myNamespace 

#endif // CLASS_H_INCLUDED 

class.pp

#include <iostream> 
#include "class.h" 

// using namespace std; // Don't Use - This is Bad Practice 
         // Can cause name clashing when trying to resolve name lookup 


namespace myNamespace { 

void Cat::speak() { 
    if (happy) { 
     std::cout << "meoww" << std::endl; 
    } else { 
     std::cout << "sssss" << std::endl; 
    } 
} 

void Cat::makehappy() { 
    happy = true; 
} 

void Cat::makesad() { 
    happy = false; 
} 

} // namespace myNamespace 

main.cpp

#include <iostream> 
#include "class.h" 
// using namespace std; // Again -Bad Practice 

int main() { 
    using namespace myNamespace;  

    Cat jim; 
    jim.makehappy(); 
    jim.speak(); 

    Cat george; 
    george.makesad(); 
    george.speak(); 

    return 0; 
} 

sen ar görmek için bu deneyin Aynı derleyici hatası alıyorum. Bu işlevi birden çok alanda tanımladığınıza bakmanıza yardımcı olur. Ayrıca, using namespace std;'u kaldırarak ve yalnızca kapsam çözünürlüğü operatörünü std:: ad alanına kullanarak olası sorunları ve olası gelecekteki sorunları ortadan kaldırmaya yardımcı olur.

+0

'un bir resmini denedim ama yine de aynı sorunlarla karşılaşıyorum – Georgez

+0

@Georgez hmm; çözümünüzü temizlemeyi deneyin. Tüm eski nesne dosyalarını kaldırın. Sonra yeniden derleyin ve yeniden oluşturun. –