2017-11-11 1 views
-2

Ich bin derzeit viel Frustration mit Header-Datei in meinem Start-Projekt. Bisher habe ich eine Header-Datei mit meiner Basis-Datei verknüpft und ich bekomme immer den gleichen Fehler, dass die Kompilierung meine Basisklasse nicht lesen kann.C++ Header-Datei Fehler: Basisklasse undefiniert

Ich glaube, dass es ein Problem mit dem Lesen der Header-Datei gibt. Was soll ich machen?

// Aktualisieren es Kompilierungsfehler mit dem Build

Haupt CPP-Datei

#include <string> 
#include "animal.h" 
using namespace std; 
enum COLOR { Green, Blue, White, Black, Brown }; 

int main() { 

cout << "Starting" << endl; 
int value = 0; Mammal *zoo[3]; 
int i = 0; 

cout << "Program exiting …. " << endl; 
return 0; 
} 

Header-Datei

#include <iostream> 
#include <string> 
#ifndef HEADER_H 
#define HEADER_H 

using namespace std; 
enum COLOR { Green, Blue, White, Black, Brown }; 

class Animal { 
public: 
Animal() { 
    cout << "constructing Animal object " << _name << endl; 
} 
~Animal() { 
    cout << "destructing Animal object " << _name << endl; 
} 

Animal(std::string n, COLOR c) { 
    _name = n; _color = c; 
    cout << "constructing " << _name << " Color " << 
     endl; 
} 

virtual void speak() const { cout << "Animal speaks " << endl; } 
//void speak() const { cout << "Animal speaks " << endl; } 
virtual void move() = 0; 

void setName(std::string n) { _name = n; } 
void setCOLOR(COLOR c) { _color = c; } 

private: 
std::string _name; COLOR _color; 
}; 

class Mammal : public Animal { 
public: 
Mammal() {} 
Mammal(std::string n, COLOR c) { 
    setName(n); 
    setCOLOR(c); 
    cout << "constructing Mammal object " << endl; 
} 
~Mammal() { cout << "destructing Mammal object " << endl; } 
}; 

#endif 
+0

Sollte nicht 'COLOR' in' animal.h' deklariert werden, bevor Sie es verwenden? – user0042

+0

'COLOR' ist in der cpp-Datei definiert und in der Kopfzeile nicht sichtbar, Sie verwenden' cout' und andere Sachen aus 'std'-Namespace in der Header-Datei, ohne' :: std :: 'korrekt voranzustellen. – VTT

Antwort

0

mit pragma once und umfassen Wachen zusammen zeigt, redundant. Entfernen Sie einen.

Wenn Sie string in der Kopfzeile verwenden, vergessen Sie nicht, dass es std:: Präfix benötigt.

COLOR muss in die Header-Datei verschoben werden.

// #pragma once 
#ifndef HEADER_H 
#define HEADER_H 

using namespace std; 
enum COLOR { Green, Blue, White, Black, Brown }; 

Sie müssen auch setName

Abschließend definieren:

in C und C++, jede Art oder Funktion muß zunächst erklärt oder definiert wird dann verwendet, und nicht das umgekehrt.

+0

Es ist nicht redundant, wenn man 'pragma once' verwendet und Header-Wächter zusammen verschiedene Effekte haben, als nur einen von ihnen zu verwenden. – VTT

+0

@VTT, sprichst du über den typischen praktischen Gebrauch? – Arash

+0

@ArashMohammadi _ "Vergiss nicht" namespace std' in der Header-Datei zu verwenden ... "_ Schlimmster Rat, den ich mir vorstellen konnte. – user0042