Inicjalizowanie struktury w konstruktorze

0

Witam,
próbuję zainicjalizować zmienną strukturalną klasy poprzez konstruktor. Moje rozumowanie jest takie: muszę operować na zmiennych oryginalnych więc aby odwołać się z kontruktora do obiektu wywołującego, skorzystam z wyrażenia this. Ponieważ this to jest cały obiekt, to do zmiennej strukturalnej odwołam się poprzez this->golf->fullname oraz this->golf->handicap. Jednak powyższe wyrażenia są adresem, bo this jest wskaźnikiem, więc muszę zastosować operator wyłuskania: (*this).golf.fullname, oraz (this*).golf.handicap.

Dostaję jednak błąd : [Error] request for member 'golf' in '(Golf*)this', which is of pointer type 'Golf*' (maybe you meant to use '->' ?)

#include <iostream>
#include <cstring>

class Golf {
	private:
		static const int Len = 40;
		struct golf {
			char fullname[Len];
			int handicap;
		};
	public:
		Golf (const char*, int);
		
};

Golf::Golf(const char* name, int hc) {
	strcpy((*this).golf.fullname, name);
	(*this).golf.handicap = hc;
}
2
  1. (*this).golf to typ, a nie zmienna. Robisz rzecz analogiczną do tej:
struct struktura
{
    int i;
};

int main()
{
    struktura.i = 5;
}

Należy zatem zrobić coś takiego:

struct golf_t {
            char fullname[Len];
            int handicap;
        } golf;
  1. Jeśli już koniecznie musisz lub chcesz korzystać z cstringów a nie z std::string (polecam), to chociaż sprawdzaj zakresy na litość!, bo tutaj:strcpy((*this).golf.fullname, name); masz buffer overflow jeśli name (wliczając '\0') jest dłuższy niż Len. Potrafisz udowodnić, że nie jest?

  2. Zamiast pisać: (*this).cośtam możesz równie dobrze pisać: this->cośtam To jest całkowicie analogiczna konstrukcja. Natomiast operator -> nie jest analogiczny do operatora . Zupełnie co innego znaczy foo.bar niż foo->bar. To pierwsze zadziała, gdy foo jest obiektem. To drugie, gdy jest wskaźnikiem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1