• Willkommen, Gast!
  • Freitag, 30. Oktober 2020, 01:59:18
Position: Home » Allgemeines » Allgemeines Board » Problemschen mit C++ :(
Antworten
Thema: Problemschen mit C++ :( [Seite 1 ]

Kein neuer Beitrag Mars , 16.09.2010, 12:55
Beitrag #1   

IP: n/a
Rang: * * * * * * *
Registrierung: 04.09.2007, 15:49
Homepage: http://www.mliebgott.de
Wohnort: Dresden
 

Forum-Gott mit 1025 Punkte, 697 Beiträge
Moin moin *hust* Mahlzeit,
ich habe ein kleines Problemschen mit C++ ...
und zwar folgendes ...
Ich habe eine Listen-Klasse als Template, worin Referenzen gespeichert werden alias ...
C++:
1
2
3
4
5
6
7
8
9
template <class T>
class Liste {
  ...
};

// dazu noch eine andere Klasse ... nehm ich mal eine Bücherklasse ...
class Book {
  ...
};

So ... jetzt dir Frage ...
wie/wo muss ich die Liste definieren, wenn ich egal wo mit der Liste arbeiten will?
Ich hoffe es ist Verständlich, was ich Fragen möchte ...

Hier noch ein paar Codezeilen zum besseren Verständnis...

main.cpp
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
int main(){
  fkt_die_in_die_Liste_einfügt();
  show_list();
}

void fkt_die_in_die_Liste_was_einfügt(){
  // Einlesen von was weiss ich
  into_list();
}

void show_list(){
  zeige_liste();
}

bla.cpp
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void fkt_die_in_die_Liste_einfügt(){
  Liste<Book> *book_list;
  // bla bla blubber blubber
  book_list->add(irgend_was);
}

// Auf die Funktion kommts mir an ... mein ganzes Problem
void zeige_liste(){
  if(book_list){
    cout << "ja Liste gibts" << endl;
  }else{
    cerr << "Liste nciht vorhanden" << endl;
  }
}

beim Aufruf der zeige_liste()-Fkt. bekomm ich nen Backtrace ...

Kann mir jemand helfen? :-(

 
Kein neuer Beitrag Rafioso , 16.09.2010, 14:54
Beitrag #2   

IP: n/a
Rang: * * * * * * *
Registrierung: 30.08.2006, 22:31
Homepage: http://HomepageStarter.de
Wohnort: O-BW
 

Forum-Gott mit 1723 Punkte, 1537 Beiträge
Hi,

wann wird die bla.cpp eingebunden? Sollte nämlich eingebunden werden, bevor die Funktion aufgerufen
wird.

MfG
Rafioso

Aktuellste Boardsolution-Version: v1.46
Kommende Boardsolution-Version: TBA
-----------------------------------------------------
Ich erstelle nur noch Modifikationen
für aktuelle Versionen!
-----------------------------------------------------

 
Kein neuer Beitrag Mars , 16.09.2010, 14:56
Beitrag #3   

IP: n/a
Rang: * * * * * * *
Registrierung: 04.09.2007, 15:49
Homepage: http://www.mliebgott.de
Wohnort: Dresden
 

Forum-Gott mit 1025 Punkte, 697 Beiträge
Für die bla.cpp habe ich ne header-datei gemacht, wo die ganzen Funktionsprototypen drinne stehen
... diese wird in der main.cpp included ...

 
Kein neuer Beitrag Nils , 16.09.2010, 16:08
Beitrag #4   

IP: n/a
Rang: * * * * * * *
Registrierung: 01.07.2003, 18:55
Homepage: http://www.script-solution.de
Wohnort: Marburg
 

Forum-Gott mit 7812 Punkte, 7566 Beiträge
Hallo,

Mars hat folgendes geschrieben:
So ... jetzt dir Frage ...
wie/wo muss ich die Liste definieren, wenn ich egal wo mit der Liste arbeiten will?

Du meinst deklarieren? Im Falle von Templates müssen Deklaration und Definition in die
Header-Datei, weil der Compiler bei der Instanzierung des Templates die Definition braucht. Da C++
kein Modul-Konzept hat, mit Hilfe dessen der Compiler aus dem Namen auf den Ort der Definition
schließen kann, müssen auch die Definitionen in die Header-Datei, so dass sie verfügbar sind,
sobald man das Template benutzen will (wofür man ja eh die Header-Datei einbindet um die
Deklarationen zu haben).
Wenn es sich nicht um Templates handelt, sollte man normalerweise nur die Deklarationen in die
Header-Datei packen und die Definition in die dazugehörige cpp-Datei. Außer, der Compiler soll eine
Funktion inlinen können. Dann gibt es das gleiche Problem wie bei den Template-Instanzierungen.

Mars hat folgendes geschrieben:
Hier noch ein paar Codezeilen zum besseren Verständnis...

main.cpp
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
int main(){
  fkt_die_in_die_Liste_einfügt();
  show_list();
}

void fkt_die_in_die_Liste_was_einfügt(){
  // Einlesen von was weiss ich
  into_list();
}

void show_list(){
  zeige_liste();
}

bla.cpp
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void fkt_die_in_die_Liste_einfügt(){
  Liste<Book> *book_list;
  // bla bla blubber blubber
  book_list->add(irgend_was);
}

// Auf die Funktion kommts mir an ... mein ganzes Problem
void zeige_liste(){
  if(book_list){
    cout << "ja Liste gibts" << endl;
  }else{
    cerr << "Liste nciht vorhanden" << endl;
  }
}

beim Aufruf der zeige_liste()-Fkt. bekomm ich nen Backtrace ...

Ich weiß nich was der Code mir helfen soll und was er mit der obigen Frage zu tun hat. Vor allem
hat das "bekommen eines Backtraces" (du meinst sicher einen Segmentation-Fault oder?) nichts damit
zu wo man etwas hinpackt bzw. was man wo einbindet. Letzteres geschieht zur Compile-Zeit. Wenn da
was schief geht (z.B. etwas fehlt), beschwert sich der Compiler schon. Ein Segmentation-Fault hat
damit nichts zu tun.

Was mich aber wundert ist, wie du den Code überhaupt compilieren kannst. Wo kommt denn "book_list"
in zeige_liste() her? Du hast das ja zusätzlich in der fkt_die_in_die_Liste_einfügt(), aber das ist
natürlich in nem anderen Scope. Gibts das auch nochmal global?
Geht es insgesamt vllt. darum wo du die Liste (book_list) hinpacken sollst, damit du überall darauf
zugreifen kannst?

Rafioso hat folgendes geschrieben:
wann wird die bla.cpp eingebunden? Sollte nämlich eingebunden werden, bevor die Funktion aufgerufen wird.

Um gottes Willen, nein ;) Bitte keine cpp-Dateien einbinden (Auch wenn es da Ausnahmen geben mag,
aber davon sollte man nur Gebrauch machen, wenn man wirklich weiß was man tut).
Nur Header-Dateien werden eingebunden um dem Compiler die Deklarationen (und dem Präprozessor die
Konstanten usw.) bekannt zu machen, so dass er weiß, was was ist. Die cpp-Dateien werden einzelnd
compiliert und am Ende vom Linker zu einer Executable (oder etwas anderem) zusammengelinkt.

mfg Nils

 
Kein neuer Beitrag Rafioso , 16.09.2010, 20:37
Beitrag #5   

IP: n/a
Rang: * * * * * * *
Registrierung: 30.08.2006, 22:31
Homepage: http://HomepageStarter.de
Wohnort: O-BW
 

Forum-Gott mit 1723 Punkte, 1537 Beiträge
Nils hat folgendes geschrieben:
Rafioso hat folgendes geschrieben:
wann wird die bla.cpp eingebunden? Sollte nämlich eingebunden werden, bevor die Funktion aufgerufen wird.

Um gottes Willen, nein ;) Bitte keine cpp-Dateien einbinden (Auch wenn es da Ausnahmen geben mag,
aber davon sollte man nur Gebrauch machen, wenn man wirklich weiß was man tut).
Nur Header-Dateien werden eingebunden um dem Compiler die Deklarationen (und dem Präprozessor die
Konstanten usw.) bekannt zu machen, so dass er weiß, was was ist. Die cpp-Dateien werden einzelnd
compiliert und am Ende vom Linker zu einer Executable (oder etwas anderem) zusammengelinkt.

mfg Nils

Alles klar Chef :D Hab nicht viel mit C++ am Hut ;)

Aktuellste Boardsolution-Version: v1.46
Kommende Boardsolution-Version: TBA
-----------------------------------------------------
Ich erstelle nur noch Modifikationen
für aktuelle Versionen!
-----------------------------------------------------

 
Kein neuer Beitrag Mars , 19.09.2010, 19:50
Beitrag #6   

IP: n/a
Rang: * * * * * * *
Registrierung: 04.09.2007, 15:49
Homepage: http://www.mliebgott.de
Wohnort: Dresden
 

Forum-Gott mit 1025 Punkte, 697 Beiträge
Nils hat folgendes geschrieben:
Hallo,
Geht es insgesamt vllt. darum wo du die Liste (book_list) hinpacken sollst, damit du überall darauf
zugreifen kannst?


Ja im groben und ganzen ... ja ^^

mfg Marcel

 
Kein neuer Beitrag Nils , 19.09.2010, 20:08
Beitrag #7   

IP: n/a
Rang: * * * * * * *
Registrierung: 01.07.2003, 18:55
Homepage: http://www.script-solution.de
Wohnort: Marburg
 

Forum-Gott mit 7812 Punkte, 7566 Beiträge
Ok, da gibt es verschiedene Möglichkeiten. Du könntest eine statische Methode in eine Klasse
einbauen, die dir das Objekt liefert. Oder du verwendest das Entwurfsmuster Singleton. Oder du
nimmst eine globale Variable. Oder ...
In diesem Fall klingt es für mich so, als ob eine statische Methode (bzw. eine nicht-statische
Methode in einer Singleton-Klasse) geeignet wäre. Also eine Klasse mit global benötigten Daten oder
so (die eben u.a. eine Methode dafür hat).
Z.B.:
C++:
1
2
3
4
class Globals {
public:
  static Liste<Book> &get_books();
};


Wobei man bei sowas immer genau überlegen sollte, ob es denn wirklich notwendig ist, an jedem Ort
darauf zugreifen zu können. Vllt. ist es besser das Objekt per Parameter dort zu übergeben, wo es
gebraucht wird?

mfg Nils
Dieser Beitrag wurde insgesamt 1 mal editiert. Das letzte Mal 19.09.2010, 20:08 von Nils.

 
Kein neuer Beitrag Mars , 21.10.2010, 14:39
Beitrag #8   

IP: n/a
Rang: * * * * * * *
Registrierung: 04.09.2007, 15:49
Homepage: http://www.mliebgott.de
Wohnort: Dresden
 

Forum-Gott mit 1025 Punkte, 697 Beiträge
Huhu,
also ich habe meine Liste nun verwirklicht ^^
hier mal nen paar Informationen zu meinem nächsten Problem ...
Objekte werden wiefolgt in die Liste gespeichert:
C++:
1
2
3
KLASSE *obj = new KLASSE;
// speicher irgendwelche Informationen (String o.ä.) in das Objekt
list->add(obj);
Soweit so gut ... wird hinzugefügt ... bla bla bla :D

Jedoch beim Ausgeben bekomme ich statt meinen Informationen Adressen ausgeben ... is ja auch
logisch. Jedoch weiss habe ich keinen Ansatz, wie ich an meine genauen Informationen ran komme.
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template <class T>
class Elem{
  protected:
      // ...
     T *_next;
     T *_item;
  private:
      // ...
      T* getNext(){
         return _next;
      }
      
      T* getItem(){
         return _item;
      }
      // ...
};
So ist meine Elementen Klasse

Und dann gibts ja noch die Listen Klasse ... in der eine Funktion ist, die mir alle Datensätze der
Liste mit einmal ausgeben lassen soll.
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template <class T>
class Liste{
   private:
       Elem<T> *_head;
       // ...
   public:
       T* getHead(){
             return _head;
       }
       
       void show_all(){
            Elem<T> *tmp = getHead();
            while(tmp != NULL){
                tmp->getItem();
                tmp = tmp->getNext();
            }
       }
};
so ... hier sind die wichtigsten Informationen (denk ich) zu meinem beschriebenen Problem ...

Hier nochmal die Ausgabe die stattfindet:
0x8bf5200
0x8bf5260
0x8bf52c0

Ich hoffe jemand weiss was ich versuche rüberzubringen ^^

LG Marcel

 
Kein neuer Beitrag Nils , 21.10.2010, 18:56
Beitrag #9   

IP: n/a
Rang: * * * * * * *
Registrierung: 01.07.2003, 18:55
Homepage: http://www.script-solution.de
Wohnort: Marburg
 

Forum-Gott mit 7812 Punkte, 7566 Beiträge
Hallo,

zunächst mal ist es etwas ungünstig, dass die Ausgabe nicht dabei ist. Steht for tmp->getItem() ein
"cout << "?
Wenn ja, dann gibt er natürlich einfach den Pointer aus. Was du willst ist ja vermutlich das Objekt
ausgeben. Voraussetzung ist, dass die Klasse dann eine Methode für operator<<( ostream& ) überladen
hat.
Wenn das so ist (wie z.B. bei std::string), brauchst du nur den Pointer dereferenzieren:
C++:
1
cout << *(tmp->getItem());

Falls nicht, wird der Compiler meckern, dass du das Template mit dem Template-Parameter nicht
instanzieren kannst (leider oft mit einer sehr kryptischen Meldung).

Wobei es aber auch davon abhängt, was du in der Liste speicherst. Wenn du eine Liste<std::string*>
hast, d.h. T=std::string* ist, und du T* speicherst, speicherst du ja einen Pointer auf nen Pointer
auf nen String. Wenn du den dann für die Ausgabe dereferenzierst, bekommst du logischerweise den
Pointer auf den String ausgegeben, nicht den String selbst. Aber das ist natürlich auch richtig so,
weil du hast ja auch einen std::string* eingetragen und keinen std::string.
Nur, das du dich nicht wunderst, denn du trägst ja oben KLASSE* ein und nicht KLASSE. :)

mfg Nils
Dieser Beitrag wurde insgesamt 1 mal editiert. Das letzte Mal 21.10.2010, 18:56 von Nils.

 
Kein neuer Beitrag Mars , 17.11.2010, 17:12
Beitrag #10   

IP: n/a
Rang: * * * * * * *
Registrierung: 04.09.2007, 15:49
Homepage: http://www.mliebgott.de
Wohnort: Dresden
 

Forum-Gott mit 1025 Punkte, 697 Beiträge
Huhu Freunde der was weiss ich ^^

so nach längere Pause und Beseitigung von echt dummen Kleinigkeiten geht's weiter xD
Brauche wiedermal nen kleinen Gedankenstoß, wie ich was machen könnte ... sitzte da schon seit mom
... 1 -> 2 -> 3 -> 4 -> 5 = 5 Tagen dran ^^ *oje meine gute Laune* :D und zwar ... wenn ich ein
Objekt im Objekt in die Liste "speichere" ... wie komm ich an die Eigenschaften des inneren Objektes?
like
Zitat:

|----------------------------------------|
| ~Eigenschaften (außen) ~~|
|~~~~~~~~~~~~~~~~~~|
|~ |-------------------------------|~~|
|~ |~~~ (innen)~~~~~~| ~|
| ~|-------------------------------| ~~|
|-----------------------------------------|

Wie komme ich nun Ansatzweise an die inneren Eigenschaften dran?

mfg Marcel
]
Dieser Beitrag wurde insgesamt 2 mal editiert. Das letzte Mal 17.11.2010, 17:15 von Mars.

 
Kein neuer Beitrag Nils , 17.11.2010, 19:05
Beitrag #11   

IP: n/a
Rang: * * * * * * *
Registrierung: 01.07.2003, 18:55
Homepage: http://www.script-solution.de
Wohnort: Marburg
 

Forum-Gott mit 7812 Punkte, 7566 Beiträge
Hallo,

bau doch in das äußere Objekt eine Methode, die das innere Objekt liefert. Oder aber, wenn man
keinen direkten Zugriff auf das innere haben soll, bau Methoden in das Äußere ein um an die
Eigenschaften des Inneren zu kommen.

mfg Nils

 
Kein neuer Beitrag Mars , 22.11.2010, 21:01
Beitrag #12   

IP: n/a
Rang: * * * * * * *
Registrierung: 04.09.2007, 15:49
Homepage: http://www.mliebgott.de
Wohnort: Dresden
 

Forum-Gott mit 1025 Punkte, 697 Beiträge
wenn ich dich nicht hätte ey ^^

dankefein ^^

Edit: orrr neeeeee .... wie dumm ... is klar wenn nix ausgegeben wird, wenn man es ne ausgeben
lässt -.-"
Dieser Beitrag wurde insgesamt 1 mal editiert. Das letzte Mal 22.11.2010, 21:13 von Mars.

Abonnieren Druckansicht
Antworten

n/a n/a 1     (Anzeige: 1 – 12; insgesamt: 12) n/a n/a
User in diesem Thema: 0 Registrierte, 0 Versteckte, 1 Gast, 0 Bots
Keine
Legende: Administratoren, User, Moderatoren
Themenaktionen:
Beiträge verschieben

Toggle Ähnliche Themen zu „Problemschen mit C++ :(“
  Antworten Aufrufe Themeneröffnung Letzter Beitrag
Keine neuen Beiträge, nicht wichtig Keine neuen Beiträge, „heißes Thema“
Keine neuen Beiträge, offen Keine neuen Beiträge, nicht verschoben
  "Liveticker" 5 145722 16.09.2016, 00:49
Von: Tobi
19.09.2016, 20:30
Von: Rafioso Zum letzten Beitrag
Keine neuen Beiträge, nicht wichtig Keine neuen Beiträge, „heißes Thema“
Keine neuen Beiträge, offen Keine neuen Beiträge, nicht verschoben
  Bildwechsel mit Pfeiltasten 2 127616 16.09.2016, 00:56
Von: Tobi
18.09.2016, 16:28
Von: Tobi Zum letzten Beitrag
Keine neuen Beiträge, nicht wichtig Keine neuen Beiträge, „heißes Thema“
Keine neuen Beiträge, offen Keine neuen Beiträge, nicht verschoben
  Theme Wünsche 0 124284 10.02.2016, 11:05
Von: Mars
10.02.2016, 11:05
Von: Mars Zum letzten Beitrag
Keine neuen Beiträge, nicht wichtig Keine neuen Beiträge, „heißes Thema“
Keine neuen Beiträge, offen Keine neuen Beiträge, nicht verschoben
  Vorschläge für mehr Aktions-Logging 4 109224 26.01.2016, 12:23
Von: Rafioso
05.02.2016, 20:27
Von: Mars Zum letzten Beitrag
Keine neuen Beiträge, nicht wichtig Keine neuen Beiträge, „heißes Thema“
Keine neuen Beiträge, offen Keine neuen Beiträge, nicht verschoben
  Thema löschen wird nicht geloggt 8 50121 25.01.2016, 17:19
Von: othiede
26.01.2016, 09:05
Von: othiede Zum letzten Beitrag
  • 0.045798 Sek., 11 DB-Zugriffe, 1.015 MiB
  • Powered by Boardsolution v1.46