2016-10-12 1 views
0

Im Folgenden sind von 4 Klassen, ich lerne über grundlegende C++ Syntax und Junge ist es viel schwieriger und weniger nachsichtig als andere Sprachen, die ich verwendet habe. Ich habe eine Hauptklasse, Basisklasse "BaseArray" und zwei Unterklassen "OrderedArray" und "UnorderedArray".Fehler C2011: 'Klassentyp Neudefinition - Grundlegende Vererbung

Main.cpp

#include <iostream> 
#include "OrderedArray.cpp" 
#include "UnorderedArray.cpp" 

using namespace std; 

int main() { 


    system("PAUSE"); 
    return 0; 
} 

BaseArray.cpp

#include <iostream> 

using namespace std; 

class BaseArray { 
    public: 
     BaseArray::BaseArray() { 

     } 
}; 

OrderedArray.cpp

#include <iostream> 
#include "BaseArray.cpp" 

using namespace std; 

class OrderedArray : public BaseArray { 
    OrderedArray::OrderedArray() { 

    } 
}; 

UnorderedArray.cpp

#include <iostream> 
#include "BaseArray.cpp" 

using namespace std; 

class UnorderedArray : public BaseArray { 
    UnorderedArray::UnorderedArray() { 

    } 
}; 

Die Fehler, die ich erhalte, sind wie folgt, wenn ich andere Threads online suche. Ich denke, es könnte mit doppeltem Aufruf von Klassen zu tun haben. Um ehrlich zu sein, ich habe keine Ahnung. Wenn mir jemand in die richtige Richtung zeigen könnte, wäre das nett, danke im Voraus!

error C2011: 'BaseArray':'class' type redefinition 
error C2504: 'BaseArray':base class undefined 

diesen Fehler beheben ich einen der umfasst an der Spitze der main.cpp entfernen können, aber ich brauche den später auf Objekte und Anruffunktionen von den Unterklassen zu erstellen.

+2

Sie müssen Include-Wächter verwenden. – drescherjm

+6

Man sollte fast nie eine cpp-Datei enthalten. Sie müssen Ihren Code in Headerdateien verschieben oder die Schnittstelle von der Implementierung trennen. – NathanOliver

+0

[Dies] (http: // stackoverflow.com/a/36983180/4342498) beantwortet im Grunde die Frage, aber ich würde es nicht ein Betrüger nennen – NathanOliver

Antwort

0

Sie sollten Ihre Basis-Array in einem Header setzen:

BaseArray.h

#ifndef BASEARRAY_H_GUARD  // include guard 
#define BASEARRAY_H_GUARD  // include guard 

           // no using namespace !! 
           // only includes needed for what's in the header 
class BaseArray { 
    public: 
     BaseArray(); 
}; 

#endif      // include guard 

Und dann in die CPP lassen nur die Umsetzung Teil Ihrer Klasse:

BaseArray.cpp

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

using namespace std; 

BaseArray::BaseArray() {  // no need class enclosing: the BaseArray:: prefix is sufficient 
} 

Das können Sie das gleiche Prinzip auf die abgeleiteten Klassen gelten:

OrderedArray.h

#ifndef BASEARRAY_H_GUARD  // include guard 
#define BASEARRAY_H_GUARD  // include guard 

#include "BaseArray.h"   // include only those that you need but all those that you need 

class OrderedArray : public BaseArray { // requires BaseArray 
    OrderedArray(); 
}; 

#endif 

OrderedArray.cpp

#include <iostream>   // include headers that are needed for class implementation 
#include "OrderedArray.h" // this should be self contained and provide 
          // evertyhing that is needed for the class itself 

using namespace std; 

OrderedArray::OrderedArray() { 
} 

Sie dann müssen Machen Sie das gleiche für UnorderedArray und fin Sie müssen Ihre main.cpp anpassen, um .h anstelle von .cpp einzuschließen. Und du bist fertig.

Eine letzte Bemerkung: Ihre cpp-Quellcodedateien sind nun bereit für die separate Kompilierung. Dies bedeutet, dass Sie nicht mehr nur main.cpp kompilieren können, in der Hoffnung, dass es den gesamten Code enthält: Sie müssen nun die 4 cpp-Dateien kompilieren und sie miteinander verknüpfen.

Verwandte Themen