Wskazniki w klasach

0

Witam,
Jak poprawnie operowac wskaznikami?
Do czego uzywamy * a do czego &(ampersand)?
Jak korzystac ze wskaznikow w funkcjach, a jak w klasach a takze jak w klasach abstrakcyjnych?
Jak w konstruktorach klas abstrakcyjnych korzystac ze wskaznikow * czy & a jak w konstruktora klas dziedziczacych by przekazywaly wartosci do konstruktora klasy abstrakcyjnej.
Jak poprawnie zwracac std::wstring z klasy abstrakcyjnej? '
Dlaczego po wywolaniu GetClassName.c_str() w klasie abstrakcyjnej po podaniu argumentu w konstruktorze(std::string& className) i ustawieniu do go pojemnika (std::string g_className) wywalal krzaki a jak zmienilem typ zwracany na std::wstring& to dzialalo poprawnie. Dlaczego?
(GetClassName() mial zwracac g_className)

Pseudokod klasy abstrakcyjnej:

class CObject
{
private:
    std::wstring g_className;

public:
    CObject(const std::wstring& className)
        : g_className(className)
    {
    }

   std::wstring& GetClassName() { return g_className; }
};

Pseudokod klasy dziedziczacej CObject:

class CWindow : public CObject
{
private:
    std::wstring g_wndText;

public:
    CWindow(const std::wstring& wndText)
        : CObject(L"WindowClass"), g_wndText(wndText)
    {
    }

   std::wstring& GetText() { return g_wndText; }
};

To tyle ;) moze pojawic sie wiecej. Wskazniki to rozlegly temat :/

/////////EDITED!!!
Pozdrawiam.

0
* 
  • mnożenie, definicja wskaźnika, wyłuskiwanie danych ze wskaźnika
& 
  • odwoływanie się do referencji obiektu, czyli czegoś co mówi, gdzie coś leży w pamięci
    Zajmij się może czymś niskopoziomowym,żeby zrozumieć czym jest pamięć i jak jest w niej reprezentowana klasa i inne dane i, żeby dowiedzieć się, że po prostu wskaźnik wskazuje na pamięć
1

Masz konkretne pytania, więc odpowiedzi bez problemu znajdziesz w jakiejś książce/dokumentacji/kursie

0

Przeczytajcie bo zmienilem duzo w pytaniu ;)

Wiec * zwraca adres do obiektu np: 0x2410750
a & po podaniu adresu np 0x2410750, zwroci obiekt?

1

Dlaczego std::wstring& GetClassName() { return g_className; } w CWindow (po odziedziczeniu klasy CObject) po wywolaniu .c_str() zwraca tekst do WNDCLASSEX a jak zrobie std::wstring GetClassName() { return g_className; } to po wywolaniu .c_str() zwraca krzaczki.
.c_str() jest wskaznikiem const wchar_t* ale jak to wyglada w obu przypadkach. Czy .c_str() w std::wstring& jest inni niz w tym bez & a jesli tak to czym sie rozni?

1
aifam96 napisał(a):

Przeczytajcie bo zmienilem duzo w pytaniu ;)

Wiec * zwraca adres do obiektu np: 0x2410750
a & po podaniu adresu np 0x2410750, zwroci obiekt?

Odwrotnie

0

Bardzo bym prosil zeby ktos podal albo jakas dokumentacje po polsku o wskaznikach ktora bedzie miala odpowiedzi na te pytania albo o odpowiedz na te pytania ktore zadalem . :)

1
aifam96 napisał(a):

Dlaczego std::wstring& GetClassName() { return g_className; } w CWindow (po odziedziczeniu klasy CObject) po wywolaniu .c_str() zwraca tekst do WNDCLASSEX a jak zrobie std::wstring GetClassName() { return g_className; } to po wywolaniu .c_str() zwraca krzaczki.
.c_str() jest wskaznikiem const char* ale jak to wyglada w obu przypadkach. Czy .c_str() w std::string& jest inni niz w tym bez & a jesli tak to czym sie rozni?

& oznacza w tym przypadku referencję. Twój kod w drugim przypadku wygląda zapewnie tak:

auto ptr = x.GetClassName().c_str();
wyswietl(ptr);

Jeśli tak jest, to do ptr przypisujesz wskaźnik do danych tymczasowego obiektu typu wstring, który znika wraz ze średnikiem, wobec czego dokonujesz w następnej linii dereferencji wskaźnika do nieistniejącego obszaru pamięci, czyli UB.

PS: std::wstring::c_str zwraca wchar_t

0

Jak zamierasz zrobić to drugie... Może tak:

 
int main()
{
int zmienna = 5;
metoda(zmienna);
}
void metoda(int arg)
{
}

To zmienna i arg znajdują się w różnych miejscach w pamięci zmienna np ma twój adres 0x2410750(chociaż na/względem image base to nie pasuje raczej będzie znajdować się blisko 400000 lub 1 mln)
a arg np. 0x430021 Ale mają tą samą wartość !.
Więc zmiana jednego nie wpływa na zmiane drugiego. Nie wiem czy o to ci chodziło. A referencja zmienia to bo ona zawiera informację o adresie w tym przypadku twoim 0x2410750 więc arg i zmienna mają ten sam adres i jest to implementacja kompilatora, przez to w przeciwieństwie do wskaźników nie mają swojej reprezentacji w assemblerze. Przynajmniej ja tak to zawsze rozumiem XD

0

to jak to wprowadzic dziadostwo do WNDCLASSEX, czy tylko poprzez referencje?

Można pozbyć się tej zmiennej i metody całkowicie.

WNDCLASSEX wc;
...
wc.lpszClassName = L"AlaMaKota"; // jedyne miejsce gdzie jest nazwa klasy okna
...
ATOM atom = RegisterClassEx(&wc);

HWND hwnd = CreateWindowEx(
        0,
        MAKEINTATOM(atom),
        ...
    );

Zmienna atom może być lokalna, a może być to pole w klasie. Jeśli wystąpi błąd w RegisterClass to wynosi NULL.

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