Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Klassenvariablen weglassen

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
03.11.2009, 19:11 Uhr
TOSHMAX



Hi,

ich habe eine *.cpp und eine *.h Datei, aus denen ich eine *.lib erstelle.
In der Header-Datei steht eine Klassendefinition, die einige Variablen benötigt, die der spätere Benutzer der *.lib aber nicht kennen muss/soll.

Ist es deshalb möglich, in der Header-Datei die gesamten private-Variablen weg zu lassen, sodass nur noch die Variablen stehen bleiben, dir er braucht um die Klasse zu verwenden?

Gruß
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
03.11.2009, 19:25 Uhr
0xdeadbeef
Gott
(Operator)


Nein, der Compiler muss schon wissen, wie groß er Objekte der Klasse anlegen muss.

Was du allerdings machen kannst (und was sich aus Gründen der Binärkompatibilität auch empfiehlt), ist das pimpl-Idiom. Das sieht dann etwa so aus:

C++:
#ifndef INCLUDED_FOO_HH
#define INCLUDED_FOO_HH

#include <memory>

class foo_impl;

class foo {
public:
  foo();
  void do_something();

private:
  std::auto_ptr<foo_impl> pimpl_;
};

#endif



C++:
#ifndef INCLUDED_FOO_IMPL_HH
#define INCLUDED_FOO_IMPL_HH

class foo_impl {
public:
  void do_something();

private:
  int x_, y_, z_;
  // Was man sonst so braucht
};

#endif



C++:
// foo.cc

#include "foo.hh"
#include "foo_impl.hh"

foo::foo() : pimpl_(new foo_impl()) { }

void foo::do_something() {
  pimpl->do_something();
}


Mit der .lib/.dll lieferst du dann nur die foo.hh aus.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.11.2009, 11:28 Uhr
TOSHMAX



Muss man das selbe auch bei Funktionen machen, oder gibt es da Unterschiede aufgrund des vtables in dem sie gespeichert werden?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
04.11.2009, 15:55 Uhr
0xdeadbeef
Gott
(Operator)


Äh...das Interface der Klasse muss in jedem Fall bekannt sein. Sonst könnte man sie ja nicht benutzen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
04.11.2009, 16:50 Uhr
TOSHMAX



Also, wenn ich die private-Funktionen, die ja sowieso nicht benutzt werden können, nicht mit ausliefere läuft trotzdem alles wunderbar.

Oder versteh ich da was falsch und es ist "zufall", ob es hier einen Fehler gibt?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
04.11.2009, 16:52 Uhr
0xdeadbeef
Gott
(Operator)


Ach sorum. Dass das läuft, scheint mir eher zufällig zu sein. Ich nehme auch an, dass dir das mindestens bei virtuellen Funktionen um die Ohren fliegt. Ich würde sie auch in die Implementationsklasse verlagern, wenn ich du wäre.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
04.11.2009, 17:35 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)



Zitat von TOSHMAX:
Also, wenn ich die private-Funktionen, die ja sowieso nicht benutzt werden können, nicht mit ausliefere läuft trotzdem alles wunderbar.

Oder versteh ich da was falsch und es ist "zufall", ob es hier einen Fehler gibt?

Ja das ist Zufall. Aber der Zufall ist nicht das es funktioniert, sondern das du den Fehler nicht siehst.

Wenn du die Variablen im Header weg lässt weiß der Kompiler der deine Bibliothek einbindet nicht wie viel Platz Objekte dieser Klasse tatsächlich benötigen und reserviert dafür zu wenig. Dadurch wird dann beim Erstellen einer Instanz anderer Speicher welcher meist schon für etwas anderes reserviert ist überschrieben.

Das kein Fehler auftritt könnte auch daran liegen das du das im Debug Modus laufen hast wo meist mehr Speicher für Variablen/Objekte reserviert wird als nötig und es so zufällig noch da mit rein passt.


So oder so ist es falsch und du musst dem Kompiler den kompletten Klassenaufbau bekannt geben.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
04.11.2009, 17:46 Uhr
TOSHMAX



Gut, dann werde ich das so machen.

Vielen Dank für die Antworten!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
04.11.2009, 23:08 Uhr
0xdeadbeef
Gott
(Operator)


Da ging's ja jetzt um Funktionen, Guybrush - die nehmen, sofern sie nicht virtuell sind, nicht notwendigerweise Platz im Objekt ein. Das wird mit vielen Compilern wohl funktionieren, aber es ist, wenn mich grad nicht alles täuscht, keine verlässliche Lösung. Auf jeden Fall wäre es eine erstaunlich hässliche.

Wenn Interesse besteht, kann ich das mal im Standard nachschlagen. Unabhängig davon, was der dazu sagt, kann ich so ein Vorgehen aber niemandem empfehlen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
05.11.2009, 12:30 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Achso sorry hab den Eingangspost gelsen und den Rest nur überflogen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: