2016-05-20 14 views
-5

Ich weiß, dass Fragen zu diesem Fehler wiederholt gestellt wurden, jedoch scheint keine der vorherigen Antworten mein Problem zu lösen."Zuordnung eines Objekts der abstrakten Klassenart" Fehler, obwohl alle Funktionen Implementierungen haben

Ich habe eine reine abstrakte Klasse ITile:

class ITile { 
public: 
    virtual ~ITile() {} 
    virtual void display() = 0; 
    virtual bool isWalkable() = 0; 
    virtual bool isGoal() = 0; 
}; 

Und drei Unterklassen, die alle diese Funktionen implementieren, wie so:

Floor.h

#include "ITile.h" 

class Floor : public ITile { 
public: 
    Floor(); 
    virtual ~Floor(); 
    virtual void display() override; 
    virtual bool isWalkable() override; 
    virtual bool isGoal() override; 
}; 

Floor.cpp

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

Floor::Floor() {} 
Floor::~Floor() {} 

void Floor::display() { 
    cout << " "; 
} 

bool Floor::isWalkable() { 
    return true; 
} 

bool Floor::isGoal() { 
    return false; 
} 

Beim Versuch, das gesamte Projekt, das ich die folgende Ausgabe zu kompilieren:

g++ -std=c++0x -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/main.d" -MT"src/main.d" -o "src/main.o" "../src/main.cpp" 
In file included from ../src/main.cpp:1: 
In file included from ../src/board.h:1: 
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/vector:265: 
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/__bit_reference:15: 
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/algorithm:627: 
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/memory:1641:31: error: allocating an object of abstract class type 'ITile' 
     ::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...); 
[...] 

... von einem Haufen von Noten gefolgt. Aber das Problem ist, ich denke, der Fehler in der letzten Zeile oben.

Also, was genau sind diese algorithm, memory Dateien und so weiter? Wie kann ich diesen Fehler beheben?

Ich benutze Eclipse Luna mit dem C/C++ - Plugin auf Mac OS X (Mavericks) mit den Developer Command Line Tools. Weitere Informationen gerne auf Anfrage gegeben.

Vielen Dank im Voraus!

+4

Sie ging ein wenig zu minimal in Ihrem Beispiel. Bitte poste ein [mcve] – NathanOliver

+2

@NathanOliver: Es ist nicht so sehr, dass es zu minimal ist. Es ist, dass es unvollständig ist.Er vermisst die "Hauptfunktion", die alles miteinander verbindet. Derjenige, der fast sicher einen 'Vektor ' verwendet. –

+0

@NathanOliver Nun, ich selbst hasse es, die kompletten Projekte anderer Leute zu lesen. Ich dachte, das könnte genug sein, damit ein Profi meinen Fehler findet. Was sollte ich sonst noch posten? –

Antwort

2

Sie können keine std::vector<ITile> deklarieren, weil ITile s nicht existieren kann.

Um Polymorphie in einem Container zu verwenden, müssen Sie Zeiger speichern. Diese Zeiger zeigen auf dynamisch zugewiesene Objekte vom Typ Floor, Wall, Ceiling & hellip; was immer du sonst noch hast.

Betrachten Sie eine std::vector<std::unique_ptr<ITile>>.

+0

Ich frage mich nur, ob ein leeres 'std :: vector ' gut (wenn auch nutzlos) seit C++ 11 ist, solange Sie keine Operationen, die einen CopyConstructible oder CopyAssignable Typ erfordern, als eine abstrakte Klasse aufrufen ist kein unvollständiger Typ. –

+0

@ChristianHackl: Nicht sicher, wie viel der Standard über die Implementierung vorschreibt. Wenn ein Vektor genügend Platz für 5 'ITile's erhalten sollte, ist das noch in Ordnung? Ich weiß, dass es nur _needs_ braucht, um 'sizeof (ITile)' zu kennen, was es tun kann, und in der Praxis wirst du wahrscheinlich einen Block von 'char's zu place-new bekommen, wenn jemand später einige tatsächliche Elemente erstellt . Aber ist das garantiert? Hmm. –

+0

@ChristianHackl konforme Implementierung sollte dies ermöglichen. Anforderungen an Typen, die in Vektor gespeichert sind, werden durch Funktionen angewiesen, die an dem Vektor aufgerufen werden. Und 'vector :: vector()' stellt keine Anforderungen an den zugrunde liegenden Typ. – SergeyA

1

ITile ist eine abstrakte Klasse.

Für C++ 11-Compiler können Sie keine erstellen. std::vector kann nur mit den Typen CopyConstructible und CopyAssignable verwendet werden. Eine abstrakte Klasse ist weder CopyConstructile noch CopyAssignable.

Wenn Sie einen C++ 11 oder späteren Compiler verwenden, muss der Typ nicht CopyConstructible und CopyAssignable sein, um eine std::vector zu erstellen. Andere Mitgliedsfunktionen können diese Anforderungen auferlegen. Wenn Ihr Compiler nicht streng konform ist, wird es keinen std::vector für solche Typen erstellen.

Weitere Informationen:

http://en.cppreference.com/w/cpp/container/vector http://en.cppreference.com/w/cpp/concept/CopyConstructible http://en.cppreference.com/w/cpp/concept/CopyAssignable

+0

Zu langsam alter Mann! –

+0

Sie werden eines Tages dort ankommen, Mann mittleren Alters! –

+0

Und um hinzuzufügen, RSahu, wird er da sein, wenn @LightnessRacesinOrbit glücklich genug ist! – SergeyA