Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » get-Funktion läßt sich nicht inline definieren

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
18.09.2006, 20:52 Uhr
Yadgar



High!

Das Problem mit der vector-Definition für FractInt etc. habe ich gelöst (indem ich gleich in fractint.h schon vector inkludiere, anschließend NamedObjectBase deklariere und darauf dann die vector-Definition folgen lasse)... jetzt wundere ich mich allerdings, dass sich der Linker über einen undefinierten Verweis auf FractInt::getNenner bzw. FractInt::getZaehler beschwert, obwohl doch beide in fractint.cpp (der Implementationsdatei) implementiert sind - wegen ihrer Kürze allerdings inline, wie man es ja üblicherweise mit "Gettern" macht.

Wieso findet der Linker sie dann nicht? Dasselbe ist mir vorhin auch mit der NamedObjectBase-Methode getName (liefert String zurück) passiert, ich konnte das Problem lösen, indem ich das inline entfernte! Eigentlich sollte doch in allen drei genannten Fällen inline keine Schwierigkeiten machen, da die Funktionen weder rekursiv noch virtuell sind oder gar variable Argumentlisten haben...

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.09.2006, 21:07 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Na ja, wieso es nicht geht kann ich mir auch nicht erklären ( du hast die Methoden in der .h datei ja bestimmt deklariert...) - allerdings ist inline IMHO unnötig, da der Kompiler sowieso optimieren (sollte?!) wenn er es kann. Auch wenn kein inline davor steht !
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.09.2006, 22:32 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi,
das Problem kenn ich - irgendwie akzeptieren manche Compiler (evtl ists ja sogar richtig?) inline von klassenfunktionen nicht wenn du diese dann von "außen" aufrufst. Wenn du sie innerhalb der Klasse verwendest - funktioniert es - nur außerhalb der Klasse nicht.

Weiß halt nur nicht ob das Bug oder Feature ist.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
19.09.2006, 08:46 Uhr
ao

(Operator)



Zitat von Yadgar:
jetzt wundere ich mich allerdings, dass sich der Linker über einen undefinierten Verweis auf FractInt::getNenner bzw. FractInt::getZaehler beschwert, obwohl doch beide in fractint.cpp (der Implementationsdatei) implementiert sind - wegen ihrer Kürze allerdings inline, wie man es ja üblicherweise mit "Gettern" macht.

Inliner müssen im .h-File definiert werden, ähnlich wie Templates.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.09.2006, 09:57 Uhr
Th



Ist ja auch logisch, daß inline-Methoden in der Header-Datei definiert werden müssen, da sie ja sonst nicht in anderen Modulen bekannt sind (und schließlich soll ja der Quellcode direkt dort eingesetzt werden und eben kein Methoden/Funktions-Aufruf dort stattfinden).

P.S. Für private Methoden kann man dann natürlich die inline-Methoden nur in der CPP-Datei definieren, da diese ja von extern nicht aufgerufen werden können.

Dieser Post wurde am 19.09.2006 um 09:59 Uhr von Th editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
19.09.2006, 10:48 Uhr
stephanw
localhorst



Zitat von Th:
Ist ja auch logisch, daß inline-Methoden in der Header-Datei definiert werden müssen, da sie ja sonst nicht in anderen Modulen bekannt sind (und schließlich soll ja der Quellcode direkt dort eingesetzt werden und eben kein Methoden/Funktions-Aufruf dort stattfinden).

So logisch finde ich das gar nicht. Das ist ein rein technisches Problem, schließlich könnte -theoretisch- auch der Linker die inline-Ersetzung durchführen.

@Yadgar: inline gut und schön... allerdings erkaufst Du Dir damit u.U. längere Buildzeiten bei großen Projekten, wenn dann mal was an so einer Fkt. geändert werden soll. Darum sollte man inline nur da benutzen, wo es wirklich Sinn macht, also für kleine und Kleinst-funktionen, die in hochperformantem Code aufgerufen werden. Eine Garantie für die Inline-Ersetzung gibts sowieso nicht, das ist nur eine Empfehlung für den Compiler. Aber das nur nebenbei.
--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
19.09.2006, 10:54 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


bei gettern und settern macht er das meist schon inline (sogar automatisch wenn du optimierungen an hast) vor allem wenn es eben nur ne kapselung gegenüber der Variablen ist, also z.b


C++:
int Class::getVar() { return var; }



da erzeugt er nie nen call
--
class God : public ChuckNorris { };
 
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: