Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Frage bzgl Vektoren

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 <
000
21.11.2007, 20:43 Uhr
HansGeorg



wenn ich folgendes erstelle:



C++:
class test
{
private:
int zahl;
public:
void zahleingeben(int a)
{
zahl = a;
}
void gebezahlaus()
{
std::cout<<zahl;
}
};

class b
{
private:
std::vector<test> abc;
public:
void push_back(const b& a_b)
{
abc.push_back(a_b);
}
void zahlanhaengen()
{
abc.push_back(zahleingeben(5));
}



ist dann im vector test jeweils eine klasse mit eigenen daten? wenn ich nun ein neues element einfüge und dieses reinschreibe in den vector test der aus der klasse test besteht dann kann ich auch auf die memberfunktionen zugreifen.

ich hab jedoch noch nicht ganz verstanden was der vector test jetzt macht. bei structuren wird ja auch die gesamte struct reingeschrieben wird denn jetzt hier auch die gesamte klasse in test geschrieben? denn ich kann ja auf die funktionen der klasse zugreifen die im vector stehen.

könnt ihr mir das nochmal etwas näher erläutern? leider findet man wenig zum thema objekte in klassen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.11.2007, 22:54 Uhr
xXx
Devil


das geht so nicht wie du es da stehen hast. (zahleingeben sollte unbekannt sein (z. 3 v.u.))
Es ist im Prinzip nichts anderes wie ein Array ^^ nur halt dynamisch, demnach aufm Heap usw.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.11.2007, 13:57 Uhr
HansGeorg



Wie würde das ganze denn richtig gehen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.11.2007, 16:06 Uhr
xXx
Devil



C++:
class test
{
    int m_zahl;

public:
    void zahleingeben(int a)
    {
        m_zahl = a;
    }
    void gebezahlaus()
    {
        std::cout << m_zahl;
    }
};

class b
{
    std::vector<test> abc;

public:
    void push_back(const b& a_b)
    {
        abc.push_back(a_b);
    }
    void zahlanhaengen()
    {
        abc.push_back(test());
        abc.at(abc.size() - 1).zahleingeben(5);
    }
};

Und wie man es besser macht:

C++:
class foo
{
    unsigned int m_zahl;

public:
    foo(unsigned int zahl = 0) : m_zahl(zahl) {}
    unsigned int const& get() const { return m_zahl; }  
    void set(unsigned int const& zahl) { m_zahl = zahl; }
    friend std::ostream& operator << (std::ostream& out, foo const& data)
    { return out << data.m_zahl; }
};

class foo_container
{
    std::vector<foo> m_data;

public:
    void push_back(foo const& inst) { m_data.push_back(inst); }
    void push_back() { m_data.push_back(foo(5)); }
    friend std::ostream& operator<<(std::ostream& out, foo_container const& data)
    {
        for(std::vector<foo>::const_iterator it(m_data.begin()); it != m_data.end(); ++it)
            out << (*it);
        return out;
    }
};


C++:
int main()
{
    foo_container manager;
    manager.push_back();
    foo inst_value(4);
    manager.push_back(inst_value);
    manager.push_back(foo(3));
    foo inst_default;
    manager.push_back(inst_default);
    std::cout << manager << std::endl;
}
...

Dieser Post wurde am 22.11.2007 um 16:08 Uhr von xXx editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
22.11.2007, 16:21 Uhr
HansGeorg



Hallo nochmal,

danke für deine Antwort. Ok das ist eigentlich alles ganz logisch was du da aufgezählt hast. Nur was muss man ändern wenn das ganze bereits im Konstructor eingefügt wird also so:


C++:
class test
{
    int m_zahl;

public:
    test(int a)
    {
        m_zahl = a;
    }
    void gebezahlaus()
    {
        std::cout << m_zahl;
    }
};


Geht da dann einfach?
C++:
abc.push_back(test(5));
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
22.11.2007, 17:31 Uhr
HansGeorg



Oder ich hab noch eine Weitere Frage, nehmen wir an ich habe diese Klassen:


C++:
class test
{
    int m_zahl;

public:
    void zahleingeben(int a)
    {
        m_zahl = a;
    }
    void gebezahlaus()
    {
        std::cout << m_zahl;
    }
};

class b
{
    std::vector<test> abc;

public:
    void push_back(const b& a_b)
    {
        abc.push_back(a_b);
    }
    void zahlanhaengen()
    {
        abc.push_back(test());
        abc.at(abc.size() - 1).zahleingeben(5);
    }
};




Ich würde jetzt gerne über abc m_zahl ausgeben, doch nur wie komme ich ran? mit
C++:
abc[0].gebezahlaus()
geht es nicht da bekomme ich ne Zugriffsverletzung. Noch eine Annahme: Ersetzen wir die Funktion gebezahl aus durch diese:

C++:
int gebezahlaus()
{
return m_zahl;
}


Wie kann ich dann damit weiterarbeiten, also das ganze vergleichen? Ich ziehe erstmal deine einfachere methode vor. das mit den iteratoren mag ganz schön sein aber ich möchte es erstmal so probieren.

ich hoffe ihr könnt mir helfen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
22.11.2007, 19:10 Uhr
xXx
Devil


Hmmm also. Ein Vector ist ja ein Array. Nur ist es ein dynamischer Array. Die "Symptome", die bei dir jetzt auftreten, kommen, meiner Meinung nach, d.h., dass du nie den Umgang mit new ([]) und delete ([]) usw. gelernt hast.


C++:
abc[0].gebezahlaus();
Das geht, wenn abc.size() > 0 ist. Um dann aber nicht direkt eine Zugriffsverletzung zu bekommen, solltest du std::vector<>::at() nehmen, hat den angenehmen Vorteil, das eine Exception geworfen wird:

C++:
try {
    abc.at(0).gebezahlaus();
} catch (std::exception& ex) { std::cerr << ex.what() << std::endl; }
.



C++:
test(int a)
    {
        m_zahl = a;
    }
Guck dir mal Initialisierungslisten an Aber ja es geht so:

C++:
abc.push_back(test(5));
wie du ja auch in meinem Beispiel ersehen könntest :P

C++:
abc.push_back(test());
geht dann aber natürlich nicht mehr, es sei denn du legst für a einen Default-Value fest


Zitat:
Ich würde jetzt gerne über abc m_zahl ausgeben, doch nur wie komme ich ran?
Naja du hast jetzt da das Problem, das m_zahl nunmal im private-Bereich liegt, du also nicht dran kommst. Deswegen müsstest du deine gebezahlaus-Funktion nutzen. Wenn du jetzt auch schon mit deiner zahlanhaengen-Funktion einen Wert eingefügt hast, kannst du diesen dann auch ausgeben. Beachte dabei aber, dass in C++ der Index bei 0 Anfängt und size - 1 das Ende ist.

C++:
int array[100];
for (std::size_t i(0); i < 100; ++i)
    std::cout << array[i] << std::endl;
...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
23.11.2007, 16:18 Uhr
HansGeorg



Hallo nochmal ich hab jetzt das ganze etwas erweitert und jetzt hab ich wieder ein Problem. Die Klassen sehen jetzt so aus:


C++:
class test
{
private:
    std::vector<int> m_zahlen;

public:
    void zahlanhaengen(int a)
    {
        m_zahlen.push_back(a);
    }
    int zahlausgeben(int a_index)
    {
        return m_zahlen[a_index];
    }
};

class b
{
    std::vector<test> abc;

public:
    void push_back(const b& a_b)
    {
        abc.push_back(a_b);
    }
    void zahlanhaengen()
    {
        abc.push_back(test());
        abc.at(abc.size() - 1).zahlanhaengen(5);
    }
    int zahllesen(int a_index)
    {
     return abc.at(0).zahlausgeben(0);
    }
};


Ich hab damit nur ein Problem, ich schreibe eine zahl in dieses array rein. jetzt möchte ich sie so über zahllesen ausgeben und der variable übergeben, jedoch scheint das irgendwie nicht zu gehen, der compiler macht da gar nichts mehr, das programm schließt einfach.

was hab ich falsch gemacht?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
23.11.2007, 17:03 Uhr
xXx
Devil


? Also du solltest dir mal die Grundlagen angucken ^^ In dem fall liegt es daran, dass du die ganze Zeit index = 0 hast:

C++:
int zahllesen(int a_index)
    {
     return abc.at(0).zahlausgeben(0);
    }


C++:
int zahllesen(std::size_t index) const { return abc.at(index).zahlausgeben(0); }
...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


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: