Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Hilfe Konstruktorfunktion setzen static bool funktioniert nicht

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 ]
000
06.01.2008, 21:15 Uhr
~DirkS
Gast



C++:
Iso.h
class Iso {
    
    static bool isinwork;
    
public:
    Iso() { isinwork = false;} // <- Fehler  undefinied refrence to Iso::isinwork
     bool status(){return isinwork;}
    void setworkstatus(bool stat) { isinwork = stat; }  <- <- Fehler  undefinied refrence to Iso::isinwork
    

};




undefinied refrence to Iso::isinwork wird mir von compiler ausgegeben , ein MakeFile Projekt mit eclipse auf Ubuntu.
Was mache ich da falsch!????



Iso.cpp



Aufruf bei implementierung:

Iso iso;

iso.setworkstatus(true);
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.01.2008, 22:00 Uhr
0xdeadbeef
Gott
(Operator)


Die Variable ist statisch, d.h. es gibt im ganzen Programm nur eine davon. Dementsprechend musst du sie in einer Übersetzungseinheit (In diesem Fall Iso.cpp) noch instanziieren, also

C++:
// In Iso.cpp

bool Iso::isinwork;


...allerdings vermute ich, dass du hier gar keine statische Variable haben willst (willst du sowieso äußerst selten), also streich einfach das "static."
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.01.2008, 22:10 Uhr
DirkS




Zitat von 0xdeadbeef:
Die Variable ist statisch, d.h. es gibt im ganzen Programm nur eine davon. Dementsprechend musst du sie in einer Übersetzungseinheit (In diesem Fall Iso.cpp) noch instanziieren, also

C++:
// In Iso.cpp

bool Iso::isinwork;


...allerdings vermute ich, dass du hier gar keine statische Variable haben willst (willst du sowieso äußerst selten), also streich einfach das "static."



Danke für die Antwort!

Ich brauche diese static boolsche weil ich beim Erzeugen eines neuen Iso Objekts die Variable nicht immer wieder neu setzen möchte. Und eine direkte zuweisung geht nicht in der Class selbst. So dachte ich an die Konstruktorfunktion...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
06.01.2008, 22:36 Uhr
0xdeadbeef
Gott
(Operator)


Wenn du die Variable statisch machst, teilen sich alle Objekte der Klasse Iso die Variable. Das heißt, wenn du zwei Iso-Objekte iso1 und iso2 hast, und die Variable in iso1 änderst, ändert sie sich gleichzeitig auch in iso2. Es ist quasi eine versteckte globale Variable, mit allen sich daraus ergebenden Nachteilen.

Ich würd das im Zweifel so machen:

C++:
// iso.h
#ifndef INCLUDED_ISO_H
#define INCLUDED_ISO_H

class Iso {
public:
  Iso();
  bool status() const;
  void status(bool stat);

private:    
  bool status_;
};

#endif



C++:
// iso.cpp
#include "iso.h"

Iso::Iso() : status_(false) { }

bool Iso::status() const { return status_; }
void Iso::status(bool stat) { status_ = stat; }


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 06.01.2008 um 22:37 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
07.01.2008, 20:58 Uhr
~DirkS
Gast



Zitat von 0xdeadbeef:
Wenn du die Variable statisch machst, teilen sich alle Objekte der Klasse Iso die Variable. Das heißt, wenn du zwei Iso-Objekte iso1 und iso2 hast, und die Variable in iso1 änderst, ändert sie sich gleichzeitig auch in iso2. Es ist quasi eine versteckte globale Variable, mit allen sich daraus ergebenden Nachteilen.

Ich würd das im Zweifel so machen:

C++:
// iso.h
#ifndef INCLUDED_ISO_H
#define INCLUDED_ISO_H

class Iso {
public:
  Iso();
  bool status() const;
  void status(bool stat);

private:    
  bool status_;
};

#endif



C++:
// iso.cpp
#include "iso.h"

Iso::Iso() : status_(false) { }

bool Iso::status() const { return status_; }
void Iso::status(bool stat) { status_ = stat; }


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
07.01.2008, 21:02 Uhr
DirkS



Sorry habe den Text vergessen,

Danke nochmal, ich habe noch die Frage was genau das const inter der methode bool status()
bool status() const;

genau bewirkt?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
07.01.2008, 21:21 Uhr
0xdeadbeef
Gott
(Operator)


Es bewirkt, das this als Zeiger auf eine Konstante übergeben wird, das heißt, status() const verspricht, das Objekt nicht zu verändern. Dementsprechend kann die Funktion auch aufgerufen werden, wenn das Objekt einen const-qualifier bekommt. Zum Beispiel:

C++:
#include "iso.h"

#include <iostream>

void show_status(Iso const &i) {
  std::cout << i.status() << std::endl;
}

int main() {
  Iso j;

  show_status(j);
}


Wenn status() nicht const ist, schmeißt das einen Compilerfehler.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
07.01.2008, 21:45 Uhr
DirkS




Zitat von 0xdeadbeef:
Es bewirkt, das this als Zeiger auf eine Konstante übergeben wird, das heißt, status() const verspricht, das Objekt nicht zu verändern. Dementsprechend kann die Funktion auch aufgerufen werden, wenn das Objekt einen const-qualifier bekommt. Zum Beispiel:

C++:
#include "iso.h"

#include <iostream>

void show_status(Iso const &i) {
  std::cout << i.status() << std::endl;
}

int main() {
  Iso j;

  show_status(j);
}


Wenn status() nicht const ist, schmeißt das einen Compilerfehler.



ok, aber was wäre ein konkretes praxis Beispiel für diese Vorgehensweise?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
07.01.2008, 22:19 Uhr
0xdeadbeef
Gott
(Operator)


Nur so als einfaches Beispiel:

C++:
#include <iostream>
#include <string>

void print_size(std::string const &s) {
  std::cout << s.size() << std::endl; // std::string::size() ist const
}

int main() {
  std::string s = "foo";

  print_size(s);

  // Hier wird implizit ein temporäres std::string-Objekt erzeugt, das
  // dementsprechend nur als konstante Referenz gebunden werden kann
  print_size("bar");
}


Speziell das hier ließe sich wohl auch mit einer Kopie verwirklichen, allerdings wäre das langsamer. Davon mal abgesehen kann es durchaus vorkommen, dass du nicht kopierbare Objekte kriegst (Streams sind zum Beispiel nicht kopierbar), bei denen eine Kopie schlicht nicht machbar ist. Boost.spirit zum Beispiel ist voll davon.

Ganz allgemein ist es guter Stil, const correctness zu wahren - wenn eine Funktion ein Objekt nicht verändert, übergib es als Konstante, dann weiß der aufrufende Programmierer gleich, dass das Objekt nicht verändert wird, und er kann seine eigenen Konstanten an sie übergeben. Wenn eine Methode ein Objekt nicht verändert, deklarier sie const, dann kann derjenige, der deine Klasse benutzt, sie auch als Konstante benutzen - und so weiter und so fort. Wenn du willst, dass dein Code auch mit anderen Bibliotheken funktioniert, solltest du dir das angewöhnen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
07.01.2008, 22:31 Uhr
DirkS



Super, Danke!

Was den Stil angeht , mir fällt auf das viele Entwickler den Bereichsauflösungsoperator wie std::string z.B eher benutzen als z.B den namespace std; einfach zu definieren.
Ich dachte immer man ist eher "faul" und definiert den namespace damit man im code weniger schreiben muss. Aber eigentlich jeder Entwickler den ich kenne schreibt wie Du explizit z.B std::xyz , liegt das evtl. daran das die Übersicht bei Großprojekten so besser gewahrt bleibt?
Oder ist das einfach Geschmacksache? Klar das man auch einen anderen namespace definieren kann aber bei string z.B macht das doch keiner, oder doch?
 
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: