C++ Einfügen einer Klasse in einem map-container
Ich habe eine map in C++ und ich möchte Eingangs meiner Klasse als Wert und einen string als Schlüssel.
Wenn ich versuche, bekomme ich eine Fehlermeldung 'Scene_Branding' : illegal use of this type as an expression
Ich bekomme eine ungültige Verwendung dieses Typs als Ausdruck, und ich kann nicht scheinen, um herauszufinden, warum. Hier ist etwas code.
string CurrentScene = "Scene_Branding";
map<string, Scene> Scenes;
Scenes.insert(std::make_pair("Scene_Branding", Scene_Branding)); //<-- Illegal Error parameter 2
und hier ist die Szene Branding header..
#ifndef Scene_Branding_H
#define Scene_Branding_H
#include "Scene.h"
#include <iostream>
#include <string>
class Scene_Branding : Scene
{
public:
Scene_Branding();
~Scene_Branding();
void Draw();
};
#endif
und hier ist die Szene header..
#ifndef Scene_H
#define Scene_H
#include <iostream>
#include <string>
class Scene
{
public:
Scene();
~Scene();
virtual void Draw();
};
#endif
und hier ist es-cpp-Dateien.
Szene cpp.
#include "Scene.h"
Scene::Scene()
{
}
Scene::~Scene()
{
}
void Scene::Draw(){
std::cout << "Hey";
}
Scene_Branding cpp
#include "Scene_Branding.h"
Scene_Branding::Scene_Branding()
{
}
Scene_Branding::~Scene_Branding()
{
}
void Scene_Branding::Draw()
{
std::cout << "Drawing from Scene_branding";
}
- beide Antworten sind richtig, darauf hinzuweisen, dass, müssen Sie eine Instanz der Scene_Branding nicht nur der Typ. ein Hinweis darauf, machen Sie Ihre Basisklasse destructor virtual
- Meinst du das wirklich private Vererbung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ersten, nicht speichern Sie die Objekte selbst in der Karte, speichern Zeiger auf deine Objekte.
Zweitens, müssen Sie eine Instanz von Scene_Branding std::make_pair, nicht die Klasse selbst.
BEARBEITEN:
Hier ist, wie Sie gehen über die Speicherung von Zeigern:
Aber, da Sie aufgefordert, diese Art von Frage, ich empfehle Ihnen, Lesen Sie ein gutes c++ Buch für weitere greifen Konzepte wie Zeiger.
Scene
Klasse. Wenn es Unterklassen dann mitmap<string, Scene>
verursachen object-slicing. Eine Finale Klasse verhindert diese situation.Versuchen:
Denke ich, dass Sie nicht wollen, zu tun.
boost::ptr_map
statt, wenn es euer Wunsch istSo, der "neue" code:
Und die neue Art zu speichern diese:
Und Sie können es verwenden, wie folgt:
Die nette Sache über Boost-Zeiger-Container ist, dass es wurde gedacht, für polymorphe Typen, mit Ausnahme von Sicherheit und allem, und doch imitiert das Verhalten bzw. die Schnittstelle der STL, so dass Sie nicht verloren gehen 🙂
Scene_Branding*
ist umwandelbar zu einemScene*
(es heißt kovariante Rückgabe). Es bedeutet, dass durch die Anrufung desvirtual
- Methode erhalten Sie eineScene*
aber wenn du explizit dieScene_Branding::clone
dann erhalten Sie eineScene_Branding*
> wenn Sie mehr Informationen eingeben, erhalten Sie eine weitere genaue Art zurück 🙂char*
Manipulationen in C++, weilstd::string
sind aufwendiger, wenn Sie Zeichenfolgen in fast jeder anderen Sprache...Müssen Sie die Zeiger in die Klasse, wenn generische map-Container anderes Ergebnis möglich ist, wird ein neues Objekt leer der Klasse... mit Zeigern arbeiten!
Einfügen
HINWEIS: wenn-fpermisive compiler-flag nicht gesetzt ist, müssen Sie pass *Geben Sie nicht const beim einfügen in die map_ container.
Beste Grüße,
Javier,