Autor
Nachricht
m.trix
Mitglied
Benutzerprofil
Anmeldungsdatum: 07.09.2005
Beiträge: 59
m.trix Mitglied
11:48:17 09.02.2010 Titel:
Polymorphie und *_cast
Zitieren
Hallo zusammen,
hab ein kleines Problem/logischen Fehler mit Polymorphie:
Ich habe eine Basis-Klasse mit, wer denkt es sich schon?, Basis-Eigenschaften (class Object). Von dieser Klasse entsprechend abgeleitet Klassen mit Zusatz-Eigenschaften (class ObjectName oder weitere).
C/C++ Code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
#ifndef _OBJECT_H
#define _OBJECT_H
class Object
{
public :
Object ();
virtual ~Object ();
void setPos ( const float a_pos );
float getPos ( ) const ;
private :
float m_f_pos;
};
#endif // #ifndef _OBJECT_H
#ifndef _OBJECT_STATION_H
#define _OBJECT_STATION_H
#include "Object.h "
class ObjectName : public Object
{
public :
ObjectStation ();
~ObjectStation ();
void setName ( const string& a_name );
string getName ( ) const ;
private :
string m_str_name;
};
#endif // #ifndef _OBJECT_STATION_H
C/C++ Code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
#ifndef _OBJECT_H
#define _OBJECT_H
class Object
{
public :
Object ();
virtual ~Object ();
void setPos ( const float a_pos );
float getPos ( ) const ;
private :
float m_f_pos;
};
#endif // #ifndef _OBJECT_H
#ifndef _OBJECT_STATION_H
#define _OBJECT_STATION_H
#include "Object.h "
class ObjectName : public Object
{
public :
ObjectStation ();
~ObjectStation ();
void setName ( const string& a_name );
string getName ( ) const ;
private :
string m_str_name;
};
#endif // #ifndef _OBJECT_STATION_H
C/C++ Code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
#ifndef _OBJECT_H
#define _OBJECT_H
class Object
{
public :
Object ();
virtual ~Object ();
void setPos ( const float a_pos );
float getPos ( ) const ;
private :
float m_f_pos;
};
#endif // #ifndef _OBJECT_H
#ifndef _OBJECT_STATION_H
#define _OBJECT_STATION_H
#include "Object.h "
class ObjectName : public Object
{
public :
ObjectStation ();
~ObjectStation ();
void setName ( const string& a_name );
string getName ( ) const ;
private :
string m_str_name;
};
#endif // #ifndef _OBJECT_STATION_H
Zur Organisation der Objekte benutze ich einen vector mit Elementen der Basis-Klasse.
C/C++ Code: 1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 5 6 7 8 9 10 11 12
#ifndef _FINDER_H
#define _FINDER_H
class Finder
{
public :
Finder ();
~Finder ();
Object* doFind ( const string& a_name );
private :
vector < Object > m_vec_objects;
};
#endif // #ifndef _FINDER_H
C/C++ Code: 1 2 3 4 5 6 7 8 9 10 11 12
#ifndef _FINDER_H
#define _FINDER_H
class Finder
{
public :
Finder ();
~Finder ();
Object* doFind ( const string& a_name );
private :
vector < Object > m_vec_objects;
};
#endif // #ifndef _FINDER_H
C/C++ Code: 1 2 3 4 5 6 7 8 9 10 11 12
#ifndef _FINDER_H
#define _FINDER_H
class Finder
{
public :
Finder ();
~Finder ();
Object* doFind ( const string& a_name );
private :
vector < Object > m_vec_objects;
};
#endif // #ifndef _FINDER_H
Der vector wird wie gewuenscht mit Objekten der abgeleiteten Klasse gefuellt.
C/C++ Code: // creating object+filling vector
ObjectName obj;
obj.setPos ( a_pos );
obj.setName ( a_name );
m_vec_objects.push_back ( obj );
C/C++ Code: // creating object+filling vector
ObjectName obj;
obj.setPos ( a_pos );
obj.setName ( a_name );
m_vec_objects.push_back ( obj );
C/C++ Code: // creating object+filling vector
ObjectName obj;
obj.setPos ( a_pos );
obj.setName ( a_name );
m_vec_objects.push_back ( obj );
Das Problem: Beim Zugriff auf 'ObjectName::getName' steht nur Mist im Speicher.
C/C++ Code: // fetching values
ObjectName* obj = reinterpret_cast <ObjectName*>find->doFind ( a_name );
obj->getPos(); // ok
obj->getName(); // not error but useless values
C/C++ Code: // fetching values
ObjectName* obj = reinterpret_cast <ObjectName*>find->doFind ( a_name );
obj->getPos(); // ok
obj->getName(); // not error but useless values
C/C++ Code: // fetching values
ObjectName* obj = reinterpret_cast <ObjectName*>find->doFind ( a_name );
obj->getPos(); // ok
obj->getName(); // not error but useless values
Hab ich einen schweren logischen Fehler gemacht?
PS: SuFu hat mir nicht weitergeholfen.
PPS: Benutze MSVC++, denke aber das es eine Grundlegendes C++ Problem auf meiner Seite ist.
_________________ #!/bin/ssh
#The Unix Guru's View of Sex
unzip ; strip ; touch ; grep ; finger ; mount ; fsck ; more ; yes ; umount ; sleep
l'abra d'or
Mitglied
Benutzerprofil
Anmeldungsdatum: 26.12.2009
Beiträge: 373
l'abra d'or Mitglied
12:01:54 09.02.2010 Titel:
Zitieren
Google nach "Slicing".
Du speicherst Objekte im Vektor.
Du willst Pointer auf Object in deiner Liste speichern!
C/C++ Code: vector < Object* > m_vec_objects;
C/C++ Code: vector < Object* > m_vec_objects;
C/C++ Code: vector < Object* > m_vec_objects;
// nachtrag
Dann brauchst du auch keinen reinterpret_cast sondern einen dynamic_cast.
Zuletzt bearbeitet von l'abra d'or am 12:03:15 09.02.2010, insgesamt 1-mal bearbeitet
m.trix
Mitglied
Benutzerprofil
Anmeldungsdatum: 07.09.2005
Beiträge: 59
m.trix Mitglied
08:49:04 10.02.2010 Titel:
Zitieren
Vielen Dank fuer die Antwort. Das ist eine Lösung und auch die die angewendet wurde.
C/C++ Code: 1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 5 6 7 8 9 10 11 12
#ifndef _FINDER_H
#define _FINDER_H
class Finder
{
public :
Finder ();
~Finder ();
Object* doFind ( const string& a_name );
private :
vector < Object* > m_vec_objects;
};
#endif // #ifndef _FINDER_H
C/C++ Code: 1 2 3 4 5 6 7 8 9 10 11 12
#ifndef _FINDER_H
#define _FINDER_H
class Finder
{
public :
Finder ();
~Finder ();
Object* doFind ( const string& a_name );
private :
vector < Object* > m_vec_objects;
};
#endif // #ifndef _FINDER_H
C/C++ Code: 1 2 3 4 5 6 7 8 9 10 11 12
#ifndef _FINDER_H
#define _FINDER_H
class Finder
{
public :
Finder ();
~Finder ();
Object* doFind ( const string& a_name );
private :
vector < Object* > m_vec_objects;
};
#endif // #ifndef _FINDER_H
C/C++ Code: // creating object+filling vector
ObjectName* obj = new ObjectName();
obj->setPos ( a_pos );
obj->setName ( a_name );
m_vec_objects.push_back ( obj );
C/C++ Code: // creating object+filling vector
ObjectName* obj = new ObjectName();
obj->setPos ( a_pos );
obj->setName ( a_name );
m_vec_objects.push_back ( obj );
C/C++ Code: // creating object+filling vector
ObjectName* obj = new ObjectName();
obj->setPos ( a_pos );
obj->setName ( a_name );
m_vec_objects.push_back ( obj );
C/C++ Code: // fetching values
ObjectName* obj = dynamic_cast <ObjectName*>find->doFind ( a_name );
obj->getPos(); // ok
obj->getName(); // ok
C/C++ Code: // fetching values
ObjectName* obj = dynamic_cast <ObjectName*>find->doFind ( a_name );
obj->getPos(); // ok
obj->getName(); // ok
C/C++ Code: // fetching values
ObjectName* obj = dynamic_cast <ObjectName*>find->doFind ( a_name );
obj->getPos(); // ok
obj->getName(); // ok
Passt wunderbar. Problem war allerdings, dass vector<Object> nicht durch mich sondern durch Zuarbeit entstanden ist. In Zusammenarbeit (einfach vector<Object*> war nicht genug...) mit der entsprechenden Person wurden die entsprechenden Änderungen eingepflegt und gut.
Merce!
_________________ #!/bin/ssh
#The Unix Guru's View of Sex
unzip ; strip ; touch ; grep ; finger ; mount ; fsck ; more ; yes ; umount ; sleep
Zuletzt bearbeitet von m.trix am 08:51:07 10.02.2010, insgesamt 1-mal bearbeitet
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.