This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
RE: Static set member.
- From: "Smith-Rowland, Edward M" <ESmith-rowland at alionscience dot com>
- To: "Young, Michael" <Michael dot Young at paetec dot com>, <gcc-help at gcc dot gnu dot org>, <3dw4rd at verizon dot net>
- Date: Tue, 29 Aug 2006 18:13:48 -0400
- Subject: RE: Static set member.
- References: <BD32241188571B4CBD35DC95FD791C7F02A24AE5@mail1-corp.corp.paetec.com>
What a maroon!
Thanks for the reply.
I actually had a *different* problem that this example was supposed to show.
I have attached the new sources (with the obvious problem fixed :-P).
The sources compile but the linking fails!
[ed@localhost ~]$ g++ thing.cpp
/tmp/ccAhcYMW.o(.text+0x11): In function `ThingManager::show(Thing*)':
: undefined reference to `ThingManager::thingSet'
/tmp/ccAhcYMW.o(.text+0x35): In function `ThingManager::hide(Thing*)':
: undefined reference to `ThingManager::thingSet'
/tmp/ccAhcYMW.o(.text+0x49): In function `ThingManager::hideAll()':
: undefined reference to `ThingManager::thingSet'
/tmp/ccAhcYMW.o(.text+0x57): In function `ThingManager::hideAll()':
: undefined reference to `ThingManager::thingSet'
/tmp/ccAhcYMW.o(.text+0x6d): In function `ThingManager::hideAll()':
: undefined reference to `ThingManager::thingSet'
collect2: ld returned 1 exit status
Somehow, All the classes are correct but the static object is not getting instantiated.
BTW: I realize the static thing in NOT thread safe.
-----Original Message-----
From: Young, Michael [mailto:Michael.Young@paetec.com]
Sent: Tue 8/29/2006 5:37 PM
To: Smith-Rowland, Edward M; gcc-help@gcc.gnu.org
Subject: RE: Static set member.
In ThingManager, you have a thingSet member, not a thingList. Your function definitions reference a "thingList", which is not defined.
-----Original Message-----
From: gcc-help-owner@gcc.gnu.org [mailto:gcc-help-owner@gcc.gnu.org]On
Behalf Of Smith-Rowland, Edward M
Sent: Tuesday, August 29, 2006 5:17 PM
To: gcc-help@gcc.gnu.org
Subject: Static set member.
All,
I am attempting to create a singleton class something like this:
class ThingManager
{
static void show( Thing * thng );
static void hide( Thing * thng );
static void hideAll( void );
private:
static std::set<Thing *,ThingComp> thingSet;
};
I get these errors:
[ed@localhost ~]$ g++ thing.cpp
thing.cpp: In static member function `static void ThingManager::show(Thing*)':
thing.cpp:7: error: `thingList' was not declared in this scope
thing.cpp: In static member function `static void ThingManager::hide(Thing*)':
thing.cpp:13: error: `thingList' was not declared in this scope
thing.cpp: In static member function `static void ThingManager::hideAll()':
thing.cpp:19: error: `thingList' was not declared in this scope
More details (still simple) in the attached files.
What am I doing wrong???
Adding a constructor or initializer to the cpp file is an error:
std::set<Thing *,ThingComp> ThingManager::thingSet();
Ed
#include <set>
class Thing
{
public:
Thing( void ) : iThing(42) {}
int get( void ) const { return iThing; }
private:
int iThing;
};
struct ThingComp
{
bool operator()( Thing * thing1, Thing * thing2 )
{
return (thing1->get() < thing2->get());
}
};
class ThingManager
{
public:
static void show( Thing * thing );
static void hide( Thing * thing );
static void hideAll( void );
private:
static std::set<Thing *,ThingComp> thingSet;
};
#include "thing.h"
void ThingManager::show( Thing * thing )
{
thingSet.insert( thing );
}
void ThingManager::hide( Thing * thing )
{
thingSet.erase( thing );
}
void ThingManager::hideAll( void )
{
thingSet.erase( thingSet.begin(), thingSet.end() );
}
int main( int, char ** )
{
ThingManager::show( new Thing() );
return 0;
}