How to define and initialize the protected static members ?

Discussion in 'C++' started by Timothy Madden, Nov 21, 2008.

  1. Hy

    static members of non-integral type need to be declared in the class,
    but defined (and constructed or initialized) outside the class.

    Like this

    class SystemName
    {
    public:
    std::string sys_name;
    SystemName(std::string const &sys_name)
    : sys_name(sys_name)
    {
    }
    protected:
    static std::string system_type;
    };

    Now in a .cc file I want to define and initialize
    SystemName::system_type like this

    std::string SystemName::system_type("basicplatform");

    but my compiler (g++ 3.4.5) sys
    "'System::system_type' is protected in this context".

    How am I supposed to initialize it ?

    Thank you,
    Timothy Madden
    Timothy Madden, Nov 21, 2008
    #1
    1. Advertising

  2. blargg wrote:
    > Timothy Madden wrote:
    >> static members of non-integral type need to be declared in the class,
    >> but defined (and constructed or initialized) outside the class.
    >>
    >> Like this
    >>
    >> class SystemName
    >> {
    >> public:
    >> std::string sys_name;
    >> SystemName(std::string const &sys_name)
    >> : sys_name(sys_name)
    >> {
    >> }
    >> protected:
    >> static std::string system_type;
    >> };
    >>
    >> Now in a .cc file I want to define and initialize
    >> SystemName::system_type like this
    >>
    >> std::string SystemName::system_type("basicplatform");
    >>
    >> but my compiler (g++ 3.4.5) sys
    >> "'System::system_type' is protected in this context".
    >>
    >> How am I supposed to initialize it ?

    >
    > First, give us a minimal test program. How does your compiler respond to
    > the following program?
    >
    > class Foo {
    > protected:
    > static int i;
    > };
    >
    > int Foo::i( 123 );
    >
    > int main() { }
    >
    > By taking the time to write a minimal test program, in almost all cases
    > you'll track down the real cause of the bug, and its solution. In other
    > words, learn to fish.


    Well you minimal test program compiles fine.
    My error was on a line further down. My code is:

    using namespace std;

    extern
    class SystemName
    {
    public:
    string sys_name;
    protected:
    SystemName(string sys_name)
    : sys_name(sys_name)
    {
    }
    static SystemName sys_type;
    }
    &systype;

    SystemName SystemName::sys_type("basicplatform");

    SystemName &systype = SystemName::sys_type;

    I am trying to write a single-ton class, that can only be accessed
    through a reference, SystemName &systype, instead of a function
    like SystemName &SystemName::getInstance(), which is ugly.

    The real code is at work and is for a class that exposes
    application-global settings as public data members initialized
    from the application's configuration file. I think a single-ton
    class is appropriate for such a case, and I want the users of
    the configuration class to be able to access just the reference.

    The error is obviously on the last line where the reference is
    initialized with the protected member, but still in the compiler
    output messages the first error is listed at the previous line,
    with the definition of the static member, making me believe the
    compiler could not define the protected static member.

    I do not know why g++ reports the error as if on a previous line,
    even in version 4.2.4

    Thank you,
    Timothy Madden


    /*
    * POSIX version test
    *
    * Program to test POSIX version, if running on a POSIX system,
    * at compile and run time, and display values found. Returns
    * 0 to indicate success if on a POSIX system, non-zero otherwise.
    */

    #define _POSIX_SOURCE 199309

    #include <cstdlib>
    #include <iostream>
    #include <unistd.h>

    #define STRINGIZE(a) #a
    #define MAKE_STRING2(a) STRINGIZE(a)
    #define MAKE_STRING(a) MAKE_STRING2(a)

    using namespace std;

    extern
    class SystemName
    {
    public:
    string sys_name;
    protected:
    SystemName(string sys_name)
    : sys_name(sys_name)
    {
    }
    static SystemName sys_type;
    }
    &systype;

    SystemName SystemName::sys_type("basicplatform");

    SystemName &systype = SystemName::sys_type;


    int main()
    try
    {
    #ifdef _POSIX_VERSION
    cout << "Built for POSIX ";
    cout << MAKE_STRING(_POSIX_VERSION);
    cout << endl;

    if (sysconf(_SC_VERSION) != -1)
    {
    cout << "Running on POSIX ";
    cout << sysconf(_SC_VERSION);
    cout << endl;

    return EXIT_SUCCESS;
    }
    else
    {
    cout << "Not running on a POSIX system.\n";

    return EXIT_FAILURE;
    }
    #else
    cout << "Not built on a POSIX system.\n";
    return EXIT_FAILURE;
    #endif
    }
    catch (exception &e)
    {
    cerr << e.what();
    cerr << endl;
    return EXIT_FAILURE;
    }
    catch (...)
    {
    cerr << "Application error.\n";
    return EXIT_FAILURE;
    }
    Timothy Madden, Nov 21, 2008
    #2
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. JFCM
    Replies:
    4
    Views:
    5,734
  2. Seb
    Replies:
    2
    Views:
    4,699
  3. Replies:
    4
    Views:
    331
    Victor Bazarov
    Mar 28, 2006
  4. r.z.
    Replies:
    6
    Views:
    369
    red floyd
    Mar 22, 2007
  5. Steven Woody
    Replies:
    21
    Views:
    876
    James Kanze
    Jul 20, 2008
Loading...

Share This Page