Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

18.12.2012, 22:02

Fehler bei list.push_back()

Guten Abend,

Ich habe folgendes Problem und bin mit meinem Latein am Ende :thinking: :

Ich habe eine Klasse namens "CIDCard". Für diese wird in meiner "game.hpp", also im Hauptheader, eine std::list mit dem namen m_cards generiert.

Nun willl ich bei folgenden Codezeilen mehere CIDCard Objekte mittels push_back(NewCard) in die list schreiben:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    for(It = m_streets.begin(); It != m_streets.end(); ++ It)
    {
        if(It->GetColor()==Color)
        {
            Coloum ++;
        }
        else
        {
            Color = It->GetColor();
            Row ++;
            Coloum = 0;
        }
CIDCard NewCard;

        NewCard.Init(X+Coloum*XPlus,Y+Row*YPlus,It->GetStreetID(),BesitzerIDtoName(It->GetBesitzer()),true);
        m_cards.push_back(NewCard);

    }

Wenn ich kompilieren will kommen folgende Fehler:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
D:\Daten\Programmierung\C++\StreetX\game.cpp||In member function `std::string CGame::BesitzerIDtoName(int)':|
D:\Daten\Programmierung\C++\StreetX\game.cpp|1178|warning: control reaches end of non-void function|
C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\stl_construct.h|81|instantiated from `void std::_Construct(_T1*, const _T2&) [with _T1 = CIDCard, _T2 = CIDCard]'|
C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\stl_list.h|438|instantiated from `std::_List_node<_Tp>* std::list<_Tp, _Alloc>::_M_create_node(const _Tp&) [with _Tp = CIDCard, _Alloc = std::allocator<CIDCard>]'|
C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\stl_list.h|1163|instantiated from `void std::list<_Tp, _Alloc>::_M_insert(std::_List_iterator<_Tp>, const _Tp&) [with _Tp = CIDCard, _Alloc = std::allocator<CIDCard>]'|
C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\stl_list.h|785|instantiated from `void std::list<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = CIDCard, _Alloc = std::allocator<CIDCard>]'|
D:\Daten\Programmierung\C++\StreetX\game.cpp|1470|instantiated from here|
C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\ios_base.h|781|error: `std::ios_base::ios_base(const std::ios_base&)' is private|
C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\stl_construct.h|81|error: within this context|
C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\streambuf|769|error: `std::basic_streambuf<_CharT, _Traits>::basic_streambuf(const std::basic_streambuf<_CharT, _Traits>&) [with _CharT = char, _Traits = std::char_traits<char>]' is private|
C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\stl_construct.h|81|error: within this context|
||=== Erstellen beendet: 4 Fehler, 231 Warnungen===|

Ich lese daraus dass das Programm aus irgendeinem Grund auf die std::ios_base() zugreifen will und dies nicht darf, weil sie private ist ?(
Da ich die push_back funktion schon häufig (auch in diesem Programm) verwendet habe, wunderts mich das er jetzt auf einen Fehler läuft.
Achja, wenn ich die Zeile 16 auskommentiere, funktionier alles einwandfrei...
Hoffe ihr könnt mir helfen, ;)
Shutdown

Tobiking

1x Rätselkönig

  • Private Nachricht senden

2

18.12.2012, 22:42

Wenn du ein Objekt direkt übergibst (also nicht als Zeiger oder Referenz) wird eine Kopie erzeugt. Du wirst in CIDCard irgendeine Membervariable haben, die mit Streams zu tun hat und nicht kopierbar ist. Eine Lösung wäre die Objekte auf dem Heap zu erzeugen und in der Liste nur Zeiger auf die Objekte zu speichern.

3

18.12.2012, 23:28

Erstmal danke für deine Hilfe.

Habe das Problem daraufhin auch schnell lokalisieren... Ein ifstream in der Klasse.

Ich werde wohl die Lösung mit Zeigern und Heap wählen, dazu noch eine Frage:

Wenn ich das Objekt auf den Heap packe sieht das ja in etwa so aus:

CIDCard *NewCard;
NewCard = new CIDCard;

Richtig?

Wie muss ich jetzt die Typendef. für die List wählen?

Ich hätte jetzt gedacht :

list<*CIDCard> m_cards;

funktionier aber nicht, sagt dass er den Typ nicht kennt und daraufhin die m_cards keine definition haben.

Warscheinlich steh ich wieder nur gerade auf dem Schlauch und des Rätselslösung ist nur ein gedankensprung entfernt... :hmm:

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

4

18.12.2012, 23:54

Logischerweise, wenn du schon richtigerweise CIDCard* schreibst, wohl auch:
list<*CIDCard> m_cards; -> list<CIDCard*> m_cards;
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

5

18.12.2012, 23:57

NewCard = new CIDCard(); Die Klammern müssen auch hin.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

19.12.2012, 00:08

NewCard = new CIDCard(); Die Klammern müssen auch hin.

Muss nicht, nein.

@shutdown:
Probier den Stern als Teil des Types zu sehen.

C-/C++-Quelltext

1
CIDCard* NewCard = new CIDCard; // schreib den Stern zum Grundtypen hin

Wenn du dir angewöhnst das so zu schreiben und den Stern als Teil des Typen anschaust, dann wirst du merken, dass das hier keinen Sinn macht:

C-/C++-Quelltext

1
list<*CIDCard> m_cards;

Warum sollte plötzlich der Stern nach vorne kommen? Wenn du ein typedef von einem Zeiger-Typen hast, dann sieht das ja so aus:

C-/C++-Quelltext

1
typedef CIDCard* CIDCardPointer;

Dann sieht die Liste so aus:

C-/C++-Quelltext

1
list<CIDCardPointer> m_cards;

Das hättest du auch so gemacht, oder? Wenn du ein durcheinander hast wo der Stern hinkommt bei Typendeklarationen, dann ersetz (zumindest im Kopf) den Zeiger-Typen mit einem typedef und überleg wie das so aussehen würde.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »drakon« (19.12.2012, 00:15)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

19.12.2012, 07:00

Ein ifstream in der Klasse.

Ich werde wohl die Lösung mit Zeigern und Heap wählen

Stellst Du Dir die Frage gar nicht, warum Du überhaupt einen ifstream als Member in der Klasse hast und ob das wirklich sein muss? So eine Art Ressource klingt für mich nach einem nicht bis zum Ende gedachten Gedanken.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

8

19.12.2012, 13:42

Wenn du dir angewöhnst das so zu schreiben und den Stern als Teil des Typen anschaust, dann wirst du merken, dass das hier keinen Sinn macht:

C-/C++-Quelltext
1
list<*CIDCard> m_cards;

Das ist natürlich richtig. Wenn man sich dann aber Code wie diesen ansieht:

C-/C++-Quelltext

1
int* a, b;

Dann sieht es so aus, als wenn a und b Zeiger wären. Dem ist aber nicht so. Man muss halt ein mal verstanden haben wie es richtig geht.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

9

19.12.2012, 14:22

Das stimmt, aber solche Deklarationen halte ich eh für unsinnig und rate davon ab. Überliest man schnell, Initialisierung ist damit auch nicht so toll etc.

10

19.12.2012, 14:25

Statt den Stern als Teil des Typens zu sehen, was er natürlich ist, sehe ich ihn als Teil der Deklaration an sich, was er natürlich auch ist, aber das gewichte ich mehr, denn so verknüpfe ich * mit dem Namen und nicht mit dem int wodurch ich mir dann spare bei z.B. int *a, b; zu eruieren, weshalb b Fehler macht.
Aber gut, das mal recht unnötig von meiner Seite aus am Rande. Mir hilfts. ^^

MfG
Check

Werbeanzeige