C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Linkfehler

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Georg Maaß
Guest





PostPosted: Sun Oct 10, 2004 6:10 pm    Post subject: Linkfehler Reply with quote



Die Klasse kompiliert einwandfrei, aber Linker meckert an der unten
markierten Stelle:

scheduler_main.o: In function
`schedulerService::addService(gm::scheduler::EnvironmentClient*,
schedulerService*)':
scheduler_main.o(.gnu.linkonce.t._ZN16schedulerService10addServiceEPN2gm9scheduler17EnvironmentClientEPS_+0x63):
undefined reference to `schedulerService::clientServices'
collect2: ld returned 1 exit status


Ich verstehe nicht, warum er das statische Member clientServices nicht
findet, denn direkt oberhalb von addService steht es doch, also sogar in
der selben Datei. Was mache ich da falsch?


class schedulerService : public gm::Application::AppService
{
public: typedef std::map <
gm::scheduler::EnvironmentClient*
, schedulerService*
Quote:
ServiceMap;
public: schedulerService (

const std::string& Servicename
)
throw ()
:
gm::Application::AppService(Servicename)
{};
public: schedulerService (
const char* const Servicename
)
throw (std::exception)
:
gm::Application::AppService(Servicename)
{};
public: ~schedulerService()
throw ()
{};
public: void serve (
gm::Application::basic_AppService& theClient
)
throw (
gm::Application::ApplicationException
, gm::softwareBug
)
{
}

/////////////////////////////vvvvvvvvvvvvvvv/////////////
private: static ServiceMap clientServices;
private: static bool addService (
gm::scheduler::EnvironmentClient*
initiator
, schedulerService* theService
)
throw (gm::exception)
{
bool ok = false;
std::pair <
ServiceMap::iterator
, bool
Quote:
pa = clientServices.insert (
std::pair


gm::scheduler::EnvironmentClient*
,
schedulerService*
Quote:
(
initiator

, 0
)
);
/////////////////////^^^^^^^^^^^^^^^^///////////////////
return ok;
}
};


--
Georg Maaß - bioshop.de D-76227 Karlsruhe, Westmarkstraße 82
HTML, XML / JavaScript, C++, Java, PHP, VB / CGI, JSP, ASP, ASP.net
- The ultimate DHTML engine: http://gml-modul.sourceforge.net -
http://sourceforge.net/projects/gml-modul

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Schaaf
Guest





PostPosted: Sun Oct 10, 2004 7:47 pm    Post subject: Re: Linkfehler Reply with quote



"Georg Maaß" <georg (AT) bioshop (DOT) de> schrieb:

Quote:
Ich verstehe nicht, warum er das statische Member clientServices nicht
findet, ...

Ich habe mir Dein unübersichtliches Pseudo-Java nicht angesehen, aber hast
Du daran gedacht, daß statische Elemente nicht nur deklariert (in der
Klassendefinition), sondern auch extra definiert werden müssen:


(foo.hpp)

class Foo {
static int bar;
};


(foo.cpp)

int Foo::bar;

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Thomas Maeder
Guest





PostPosted: Sun Oct 10, 2004 7:58 pm    Post subject: Re: Linkfehler Reply with quote



Georg Maaß <georg (AT) bioshop (DOT) de> writes:

Quote:
Die Klasse kompiliert einwandfrei, aber Linker meckert an der unten
markierten Stelle:

scheduler_main.o: In function
`schedulerService::addService(gm::scheduler::EnvironmentClient*,
schedulerService*)':
scheduler_main.o(.gnu.linkonce.t._ZN16schedulerService10addServiceEPN2gm9scheduler17EnvironmentClientEPS_+0x63):
undefined reference to `schedulerService::clientServices'
collect2: ld returned 1 exit status


Ich verstehe nicht, warum er das statische Member clientServices nicht
findet, denn direkt oberhalb von addService steht es doch, also sogar
in der selben Datei. Was mache ich da falsch?

Zunächst mal schreibst Du unleserlichen Code. Es sieht aus, als ob Du Dich
von Java inspirieren lässt. Es wäre in dem Fall gut, Deine
Java-Angewohnheiten abzulegen, wenn Du C++ programmierst.


Quote:
class schedulerService : public gm::Application::AppService
{
public: typedef std::map
gm::scheduler::EnvironmentClient*
, schedulerService*
ServiceMap;

[sip]

Quote:
/////////////////////////////vvvvvvvvvvvvvvv/////////////
private: static ServiceMap clientServices;

Hier deklarierst Du das statische Datenmember clientServices. D.h. Du
sagst, dass der Name clientServices im Kontext der Klasse schedulerService
ein Objekt vom Typ schedulerService::ServiceMap benennt und dass dieses
Objekt über den Namen clientServices nur von innerhalb der Klasse
clientServices und ihrer Freunde zugegriffen werden darf.


Damit es die Variable aber auch gibt, musst Du sie auch definieren, indem
Du irgendwo ausserhalb der Klassendefinition schreibst:

schedulerService::ServiceMap schedulerService::clientServices;

und dafür sorgst, dass diese Definition nur einmal ins Programm gelinkt
wird.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Rolf Magnus
Guest





PostPosted: Sun Oct 10, 2004 9:52 pm    Post subject: Re: Linkfehler Reply with quote

Georg Maaß wrote:

Quote:
Die Klasse kompiliert einwandfrei, aber Linker meckert an der unten
markierten Stelle:

scheduler_main.o: In function
`schedulerService::addService(gm::scheduler::EnvironmentClient*,
schedulerService*)':

scheduler_main.o(.gnu.linkonce.t._ZN16schedulerService10addServiceEPN2gm9scheduler17EnvironmentClientEPS_+0x63):
undefined reference to `schedulerService::clientServices'
collect2: ld returned 1 exit status


Ich verstehe nicht, warum er das statische Member clientServices nicht
findet, denn direkt oberhalb von addService steht es doch, also sogar in
der selben Datei. Was mache ich da falsch?


class schedulerService : public gm::Application::AppService
{
public: typedef std::map
gm::scheduler::EnvironmentClient*
, schedulerService*
ServiceMap;
public: schedulerService (
const std::string& Servicename
)
throw ()
:
gm::Application::AppService(Servicename)
{};

Was ist denn das für ein grauenvoller Einrückungsstil? Ich versuche ja
normalerweise da offen zu bleiben und jedem seinen bevorzugten Stil zu
lassen, aber es gibt wirklich Grenzen. Das kann ja kein Mensch lesen.
Übrigens brauchst du nicht jedes Mal das "public:" zu wiederholen.

Quote:
public: schedulerService (
const char* const Servicename
)
throw (std::exception)
:
gm::Application::AppService(Servicename)
{};
public: ~schedulerService()
throw ()
{};
public: void serve (
gm::Application::basic_AppService& theClient
)
throw (
gm::Application::ApplicationException
, gm::softwareBug
)
{
}

/////////////////////////////vvvvvvvvvvvvvvv/////////////
private: static ServiceMap clientServices;

Nachdem du das Implementationsfile nicht gepostet hast, kann man nur
Vermutungen anstellen, aber hast die obige Variable auch irgendwo
definiert?

Quote:
private: static bool addService (
gm::scheduler::EnvironmentClient*
initiator
, schedulerService* theService
)
throw (gm::exception)
{
bool ok = false;
std::pair
ServiceMap::iterator
, bool
pa = clientServices.insert (
std::pair

gm::scheduler::EnvironmentClient*
,
schedulerService*
(
initiator
, 0
)
);
/////////////////////^^^^^^^^^^^^^^^^///////////////////
return ok;
}
};



--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Hubert Schmid
Guest





PostPosted: Mon Oct 11, 2004 5:27 pm    Post subject: Re: Linkfehler Reply with quote

Thomas Maeder <jvxexluzrgmr (AT) mailinator (DOT) com> writes:

Quote:
Georg Maaß <georg (AT) bioshop (DOT) de> writes:
[cut]

Zunächst mal schreibst Du unleserlichen Code. Es sieht aus, als ob
Du Dich von Java inspirieren lässt.

Wie kommt ihr auf Java-Style (Du und Markus Schaaf). Liegt es nur an
der merkwürdigen Verwendung der access-specifiers, oder habe ich was
übersehen? So genau habe ich mir den Code nicht angeschaut.

Gruß, Hubert

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Thomas Maeder
Guest





PostPosted: Mon Oct 11, 2004 8:34 pm    Post subject: Re: Linkfehler Reply with quote

Hubert Schmid <h.schmid-usenet (AT) gmx (DOT) de> writes:

Quote:
Wie kommt ihr auf Java-Style (Du und Markus Schaaf). Liegt es nur an
der merkwürdigen Verwendung der access-specifiers,

In meinem Fall ja.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Jörg Barfurth
Guest





PostPosted: Wed Oct 13, 2004 9:17 pm    Post subject: Re: Linkfehler Reply with quote



Hubert Schmid schrieb:
Quote:
Thomas Maeder <jvxexluzrgmr (AT) mailinator (DOT) com> writes:

Georg Maaß <georg (AT) bioshop (DOT) de> writes:

[cut]

Zunächst mal schreibst Du unleserlichen Code. Es sieht aus, als ob
Du Dich von Java inspirieren lässt.


Wie kommt ihr auf Java-Style (Du und Markus Schaaf). Liegt es nur an
der merkwürdigen Verwendung der access-specifiers, oder habe ich was
übersehen? So genau habe ich mir den Code nicht angeschaut.


Auch wenn ich nicht angesprochen war: Neben der Verwendung des
Access-specifiers bei jedem Member deutet auch die Definition aller
Methoden innerhalb der Klasse auf Java-Stil. Da dadurch alle Methoden
implizit inline sind wird eine separate Implementierungsdatei so
überflüssig.

Das kann hier sogar mit ursächlich für das Problem gewesen sein, denn
wenn man i.d.R. keine Implementierungsdatei für eine Klasse hat, dann
gibt es auch keinen natürlichen Ort wo man eine statische Membervariable
definieren könnte.

Ciao, Jörg

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Georg Maaß
Guest





PostPosted: Sat Oct 16, 2004 2:37 pm    Post subject: Re: Linkfehler Reply with quote

Jörg Barfurth wrote:
Quote:
wird eine separate Implementierungsdatei so
überflüssig.

Genau das war die Absicht dieser Implementierung in der Deklartion, weil
ja nur ein einziges Exemplar benötigt wird.

Quote:
Das kann hier sogar mit ursächlich für das Problem gewesen sein, denn
wenn man i.d.R. keine Implementierungsdatei für eine Klasse hat, dann
gibt es auch keinen natürlichen Ort wo man eine statische Membervariable
definieren könnte.

Richtig. Das hat das Problem provoziert, wobei der Linker nur an einer
Stelle gemeckert hat, obwohl ja an mehren Stellen auf das statische
Member zugegriffen wird. Trotzdem kritisierte er es nur an der einen
Stelle, nicht aber an den anderen beiden, die ich allerdings nicht
gepostet hatte.

Mein Versuch, das Ding so (falsch) zu instanzieren führte bei den
Doppelpunkten zum Parsefehler des Compilers. Deshalb hatte ich das
wieder weggemacht.

ServiceMap schedulerService::clientServices;

Ich hatte den Parsefehler falsch gedeutet und deshalb die falsche
Maßnahme ergriffen und die Zeile ganz gelöscht, was den Compiler
befriedigte und den Linker gegen meinen Code aufbrachte, statt den
eigentlichen Fehler zu korrigieren, welcher darin bestand, daß ich nicht
angab, daß ich das ServiceMap des schedulerService meine.

schedulerService::ServiceMap schedulerService::clientServices;

So wie von Thomas Maeder geschrieben sind Compiler und Linker zufrieden.

Mit Java hat das Ganze überhaupt nichts zu tun. Ich brauche die Klasse
einfach nur in dieser einen Datei, und sie wird auch nur an einer
einzigen Stelle instanziert. Auch die Angabe der Access-Spezifier bei
jedem einzelnen Element hat nichts mit Java zu tun. Ich habe das schon
so gemacht, bevor ich überhaupt zum ersten Mal ein Java-Programm gesehen
hatte. Außerdem in Java muß ich das so machen, weshalb ich Java hasse,
in C++ darf ich das so machen, weshalb ich C++ liebe. Warum ich das so
mache, hat rein pragmatische Gründe. So kann ich die Reihenfolge jeder
Zeit ändern, ohne auf die Zugriffsregeln achten zu müssen. Ich habe es
eben meistens mit Klassen zu tun, bei denen es auf die Reihenfolöge der
Initialisierung des Member ankommt, so daß sich ohenhin memberweise die
Zugriffsregeln private, protected und public abwechseln und ich es so
ohenhin ständig hinschreiben muß. Lediglich bei den Methoden wäre es
egal, aber da empfinde ich es dann als schöner, wenn es einheitlich ist,
selbst wenn es dort technisch nicht erforderlich wäre.

In C++ kann man eben noch über Geschmacksfragen streiten, weil einem C++
zutraut Geschmack zu haben. In Java gibt es nur Einheitsgeschmack aus
der Tüte. ;-)

--
Georg Maaß - bioshop.de D-76227 Karlsruhe, Westmarkstraße 82
HTML, XML / JavaScript, C++, Java, PHP, VB / CGI, JSP, ASP, ASP.net
- The ultimate DHTML engine: http://gml-modul.sourceforge.net -
http://sourceforge.net/projects/gml-modul

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.