2016-03-30 12 views
0

** PROBLEM BEHOBEN. Es scheint, dass ich aus Versehen einen extra Header erstellt habe, und da ich ihn gelöscht habe, hat es funktioniert. **Versuchen, die Klassen und Header zu verstehen

Also ich versuche, über Klassen und Header zu verstehen und wie ich sie zusammenarbeiten lassen kann. Ich folge einem Online-Tutorial, aber es scheint, dass etwas in meinem Code schief läuft. Das Problem ist, dass, wenn ich versuche, die main läuft es gibt mir diesen Fehler: mehrere Definition von Cat::speak() und alle anderen Funktionen.

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

Wie kompilieren Sie Ihren Code? oder besser gesagt, Sie verwenden class.cpp mehr als einmal während des Linkens. – marcinj

+0

aber 'Fehler: Multiple Definition' zeigt Linker Probleme nicht an. – marcinj

+2

Ich habe versucht, Ihren Code und hatte keine Fehler kompilieren oder verknüpfen. Wie bauen Sie? –

Antwort

1

Wie kompilieren Sie den Code? Sie müssen sicherstellen, dass Sie die spezifischen Dateien "class.o" und "main.o" separat erstellen, bevor Sie sie miteinander verbinden. Hier ist ein Beispiel Makefile.

Es sieht so aus, als ob Sie doppelte Inklusionswachen verwenden, also glaube ich nicht, dass das das Problem ist. Überprüfen Sie diese Antwort für eine ausführlichere Erklärung dessen, was passiert: Error with multiple definitions of function

1

Von dem, was Sie hier gezeigt haben, sollte es keine Probleme geben. Was Sie tun könnten, um dies vorübergehend zu lösen, um herauszufinden, ob Sie diese Funktion tatsächlich an mehreren Stellen definieren, besteht darin, Ihre Klasse in einen Namespace zu packen.

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; 
} 

die Sie interessieren, um zu sehen, wenn Sie ar e Erhalten des gleichen Compiler-Fehlers. Dies sollte Ihnen helfen zu sehen, ob Sie diese Funktion in mehreren Räumen definieren. Durch das Entfernen des using namespace std; und die Verwendung des Oszilloskop-Auflösungsoperators auf den std::-Namespace können Sie außerdem mögliche Probleme und mögliche zukünftige Probleme beseitigen.

+0

Ich versuchte es, aber immer noch begegne ich den gleichen Problemen – Georgez

+0

@Georgez hmm; Versuchen Sie, Ihre Lösung zu reinigen. Entfernen Sie alle alten Objektdateien. Dann kompiliere und baue es neu. –

Verwandte Themen