Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » objekt im vector bestimmen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 <
010
07.09.2004, 13:03 Uhr
~Dani
Gast


In dem Vector sind jetzt nur noch pointer auf die datentypen, aber weder typeid noch dynamic_cast funktioniert


C++:
//Datei main.cpp

vector<Medium*>mainVec;
int main()
{
        newAudio();
    if(typeid(getMainVec()[0]) == typeid(CdAudio*))
    {
        cout << "juhu!";  //Die Schleife wird scheinbar nicht durchlaufen...
    }
    
    return 0;
}

vector<Medium*> getMainVec()
{
    return mainVec;
}

void setMainVecAudio(CdAudio *obj)
{
    mainVec.push_back(obj);
}

void newAudio()
{
    CdAudio help;
    string interpretIn;
    string titleIn;
    string idIn;
    string lengthIn;
    string isBootIn;
    string genreIn;
    string placeIn;
    string lentIn;
    string lentByNameIn;
    string lentByMailIn;
    string releaseYearIn;
    string commentIn;
    string isSingleIn;
            
    cout << "Interpret: ";
    getline(cin, interpretIn);
    
    cout << "Titel: ";
    getline(cin, titleIn);
    
    cout << "ID: ";
    getline(cin, idIn);
    
    cout << "Länge: ";
    getline(cin, lengthIn);
    
    cout << endl << "Bootleg? 1 für ja, 0 für nein: ";
    getline(cin, isBootIn);
    
    cout << "Genre: ";
    getline(cin, genreIn);
    
    cout << "Aufbewahrungsort: ";
    getline(cin, placeIn);
    
    cout << endl << "verliehen? 1 für ja, 0 für nein: ";
    getline(cin, lentIn);
    
    cout << "ausgeliehen an (Name): ";
    getline(cin, lentByNameIn);
    
    cout << "ausgeliehen an (EMail): ";
    getline(cin, lentByMailIn);
    
    cout << "Erscheinungsjahr: ";
    getline(cin, releaseYearIn);
    
    cout << "Kommentar: ";
    getline(cin, commentIn);
    
    cout << endl << "Single? 1 für ja, 0 für nein: ";
    getline(cin, isSingleIn);
    
    help.CdAudio::newMed(interpretIn, titleIn, idIn, lengthIn, isBootIn, genreIn,
                     placeIn, lentIn, lentByNameIn, lentByMailIn,            
                                         releaseYearIn, commentIn, isSingleIn);
}




C++:
//Datei cdAudio.cpp
void CdAudio::newMed(string newInterpret, string newTitle, string newId, string newLength,
                     string newIsBoot, string newGenre, string newPlace,
                                         string newLent, string newLentByName, string newLentByMail,  
                                         string newReleaseYear, string newComment,
                                         string newIsSingle)
{
    CdAudio *newCd = new CdAudio();
    
//hier werden jetzt die einzelnen Attribute gesetzt
    
    setMainVecAudio(newCd);
}



"juhu!" wird einfach nicht ausgegeben... Obwohl es ja klappen sollte...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
07.09.2004, 13:20 Uhr
virtual
Sexiest Bit alive
(Operator)


Wenn Dynamic_cast nicht funktioniert und Du dir sic bist, daß Du ein CAudio Objekt vor Augen hast, ist die wahrscheinlichste Ursache, daß keine der Methoden virtuell ist. Sowohl typeid alsauch dynamic_cast funktionieren nur bei einer Basisklasse mit mindestens einer Virtuellen Methode.

Normalerweise muß sowieso mindestens eine Methode virtuell sein, wenn Du mit Ableitungen arbeitest, nämlich der Destruktor.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
07.09.2004, 13:28 Uhr
~Dani
Gast


Der Destruktor ist virtuell und auch die newMed()-Methode ist in cdAudio.h virtuell deklariert, da es auch eine Medium::newMed()-Methode gibt, in der alle gemeinsamen Attribute den Objekten hinzugefügt werden...
An der Stelle 0 im Vektor steht definitiv ein CdAudio-Objekt, da ja in CdAudio::newMed eins angelegt wird (ganz unten im geposteten Quelltext).

Wir wissen echt nicht mehr weiter.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
07.09.2004, 13:32 Uhr
~Dani
Gast


Der Destruktor ist virtuell und auch die newMed()-Methode ist in cdAudio.h virtuell deklariert, da es auch eine Medium::newMed()-Methode gibt, in der alle gemeinsamen Attribute den Objekten hinzugefügt werden...
An der Stelle 0 im Vektor steht definitiv ein CdAudio-Objekt, da ja in CdAudio::newMed eins angelegt wird (ganz unten im geposteten Quelltext).

Wir wissen echt nicht mehr weiter.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
07.09.2004, 13:43 Uhr
(un)wissender
Niveauwart


Mal unter den Compileroptions geschaut? Ev. sind da Exceptions und/oder RTTI deaktiviert.
Ich bin mir auch nicht ganz sicher, obtypeid mit Pointern funktioniert, ev. besser dereferenzieren.


Bearbeitung:

help.CdAudio::newMed checke ich nicht ganz, vermutlich ist help.newMed korrekt.
Außerdem solltest du bei der Parameterübergabe dringend const Referenzen verwenden und nicht per value übergeben.
Denk dran, dass der Mediumvector vor der Zerstörung mit einen Schleife durchlaufen werden muss, in der alle Mediumpointer gelöscht werden.


--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 07.09.2004 um 13:48 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
07.09.2004, 13:48 Uhr
~Dani
Gast


OK, das ist jetzt wahrscheinlich wieder ne doofe frage, aber wo seh ich das mit den compileroptions?

Aber der tipp mit den pointern scheint gut gewesen zu sein... wenn wir

C++:
if(typeid(*getMainVec()[0]) == typeid(CdAudio))
{
    cout << "juhu!";
}


nehmen, wird juhu tatsächlich ausgegeben!!!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
07.09.2004, 13:49 Uhr
(un)wissender
Niveauwart


Hängt vom Complier ab...
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
07.09.2004, 15:05 Uhr
virtual
Sexiest Bit alive
(Operator)


Probier mal den Pointer zu dereferenzieren, habe ich garnicht drauf geachtet:

C++:
if(typeid(*(getMainVec()[0])) == typeid(CdAudio))



Denn das tut bei mir:

C++:
#include <iostream>
#include <vector>
#include <typeinfo>

class base {
public:
    virtual ~base() { }
};

class derived1: public base { };
class derived2: public base { };


int main() {
    std::vector<base*> v;

    v.push_back(new base);
    v.push_back(new derived1);
    v.push_back(new derived2);

    for(int i=0; i<v.size(); ++i) {
        if (typeid(*(v[i]))==typeid(derived1)) {
            std::cout<<"Ein derived1 befindet sich an Index "<<i<<std::endl;
        }
    }

    for(int i=0; i<v.size(); ++i)
    {
        delete v[i];
    }
}


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
07.09.2004, 15:08 Uhr
virtual
Sexiest Bit alive
(Operator)


Oh, ja, hast Du ja schon selbst rausgefunden....
Nichtsdestotrotz siollte der dynamic_cast mit einem Pointer funktionieren, denke ich
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: