Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Advanced Developers Conference     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: C++ (auch C++0x, bzw. C++11) ::  Polymorphie und *_cast     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
m.trix
Mitglied

Benutzerprofil
Anmeldungsdatum: 07.09.2005
Beiträge: 59
Beitrag 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: 1201
Beitrag 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
Beitrag 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
C/C++ Forum :: C++ (auch C++0x, bzw. C++11) ::  Polymorphie und *_cast   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




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.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.