[C++] Pointer to member variable?

Pagina: 1
Acties:

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Ik heb momenteel de volgende code om een configuratie in te lezen.

C++:
1
2
3
4
else if (name == "pid_file")
    m_pid_file = value;
else if (name == "redirect_url")
    m_redirect_url = value;
Zo'n lange if else if ... lijst staat niet mooi en is ook niet echt handig. Deze wil ik vervangen door een array met key en een 'pointer' naar value. Maar hoe krijg ik zo'n 'pointer' voor elkaar?
Met global/static variables gaat het nog wel en member functie pointers bestaan ook, maar member variable pointers?
Ik wil de class member (eigenlijk) niet vervangen door een std::map ofzo, maar gewoon losse members houden.

[ Voor 12% gewijzigd door Olaf van der Spek op 30-03-2006 19:01 ]


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 07:57
Ik snap het probleem niet; wat is er mis met:
C++:
1
2
3
4
5
6
7
const int members = 123;
const char *mem_name[members] = { "foo", "bar", ... };
std::string * const mem_ref[members] = { &m_foo, &m_bar, ... };
for(int m = 0; m < members; ++m)
    if(name == mem_name[m])
        *mem_ref[m] = value;
}

Je kunt de implementatie natuurlijk eindeloos variëren, maar daar gaat het niet om - ik begrijp je fundamentele probleem niet zo?

[ Voor 4% gewijzigd door Soultaker op 30-03-2006 19:05 ]


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Soultaker schreef op donderdag 30 maart 2006 @ 19:04:
Ik snap het probleem niet; wat is er mis met:
C++:
1
2
3
4
5
6
7
const int members = 123;
const char *mem_name[members] = { "foo", "bar", ... };
std::string * const mem_ref[members] = { &m_foo, &m_bar, ... };
for(int m = 0; m < members; ++m)
    if(name == mem_name[m])
        *mem_ref[m] = value;
}

Je kunt de implementatie natuurlijk eindeloos variëren, maar daar gaat het niet om - ik begrijp je fundamentele probleem niet zo?
Ik ben verbaast dat dit zo compileerd, ik dacht dat &m_foo niet zou werken.
Nu is het wel zo dat je de link (met this) legt op het moment dat je mem_ref initialiseert.
Is het ook mogelijk een keer een member variabele te 'selecteren' (iets als de offset binnen de class) en die later te combineren met een pointer naar een object van die class?

[ Voor 21% gewijzigd door Olaf van der Spek op 30-03-2006 19:25 ]


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 07:57
Sure, als je de klasse bij naam kunt noemen:
C++:
1
2
3
4
5
6
struct Foo { int x, y, z; };
int Foo:: *v = &Foo::y;

Foo f = { 12, 34, 56 }, g = { 77, 88, 99 };
std::cout << f.*v << '-' << g.*v << std::endl;
// geeft 34-88 weer

Ik heb het zelf nog nooit nodig gehad (en het lijkt me hier ook niet noodzakelijk) maar als je een aanleiding ziet om het te gebruiken; waarom niet. ;)