• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z odwołaniem się z poziomu jednej klasy do wskaźnika do obiektu w innej klasie

0 głosów
110 wizyt
pytanie zadane 2 września 2017 w C i C++ przez wojtekd09 Początkujący (260 p.)

Witam,

Mam problem z odwołaniem się z jednej klasy do wskaźnika w innej klasie. Otóż jest taka klasa (w uproszczeniu):


class CSolidHoopsView : public CHoopsView, public HJoyStickListener 
{ 
     public: 
        BODY * bod[3] = {0,0,0}; 
}

a w niej tablica wskaźników bod. Potem wywołuję sobie funkcję tej klasy CSolidHoopsView z poziomu menu (to jest tylko wycinek kodu)

void CSolidHoopsView::OnDodajDodrzewa(){

     MyBody = (BODY*)HA_Compute_Entity_Pointer(key, BODY_TYPE);
	
	 bod[nr_cechy] = MyBody; 
}

I teraz chciałbym się do tego wskaźnika bod odnieść w klasie okna dialogowego CCechy,aby tam pobrać wartości. Tworzę sobie zatem wskaźnik view2 do klasy CSolidHoopsView

class CCechy : public CDialog, public WindowsTreeGraph
{
     CSolidHoopsView * view2;
}

W konstruktorze inicjalizuję wskaźnik zerem, a w destruktorze niszczę.

W funkcji tej klasy CCechy chcę odnieść się do składowych tego obiektu poprzez wskaźniki

ff = view2->bod[data]->lump()->shell()->face();

I tu się pojawia problem, ponieważ na tej powyższej linijce program się zawiesza i mam błąd typu Access violation, a przy debugowaniu, gdy sprawdzam zawartość bod, to wszystkie wskaźniki mają wartość 0, a także mam

Unable to read memory tak jakby wskaźnik się gubił.

Gdy tę linijkę

ff = view2->bod[data]->lump()->shell()->face();

zamieszczę w funkcji tej samej klasy tzn. CSolidHoopsView, to wszystko działa jak należy.

Może mi ktoś podpowiedzieć co robię źle? Bo myślę, że ten sposób da się wykorzystać, bo np. przy próbie odwołania się poprzez wskaźnik view2 do zmiennej int błędu nie ma - wartość się pobiera. Problem jest ze wskaźnikami. Dodam, że obie klasy są w różnych plikach.

Zamieściłem tylko fragment kodu, bo zawiera on funkcje kernela graficznego.

1 odpowiedź

0 głosów
odpowiedź 2 września 2017 przez j23 Mędrzec (175,160 p.)

W konstruktorze inicjalizuję wskaźnik zerem, a w destruktorze niszczę.

A inicjalizujesz go czymś jeszcze poza nullem? Jeśli nie, to już masz odpowiedź, dlaczego dostajesz błąd AV.

komentarz 2 września 2017 przez wojtekd09 Początkujący (260 p.)
Nie wiem czym innym miałbym go zainicjalizować. Tym bardziej, że do zmiennych typu int mam dostęp przez ten wskaźnik, tylko do innego wskaźnika już nie bardzo. Tzn. dostęp jest, ale jakby na nic konkretnego nie pokazywał.
komentarz 2 września 2017 przez j23 Mędrzec (175,160 p.)

Z Twojego opisu wynika, że view2 ma wartość NULL (ustawioną w konstruktorze). Nigdzie nie piszesz, że gdzieś temu wskaźnikowi przypisujesz poprawny adres. I stąd moje pytanie.

 

W jaki sposób przypisujesz adres temu wskaźnikowi?

 

Twierdzisz, że tablica bod ma same zera. A sprawdzałeś, czy przed feralnym wywołaniem tablica ta jest poprawnie wypełniona?

 

 

komentarz 2 września 2017 przez wojtekd09 Początkujący (260 p.)

Tablica się wypełnia - element zerowy ma jakąś wartość, bo tylko tą ustawiam na razie.

Natomiast teraz już nie wiem na co powinienem ustawić wskaźnik view2. On ma pokazywać na klasę CSolidHopsView. Więc jeśli poprzez operator -> się odwołam do jakiegoś konkretnego obiektu tej klasy np. view2->bod[0], to nie powinno działać?

komentarz 2 września 2017 przez j23 Mędrzec (175,160 p.)

view2 powinien wskazywać na istniejący obiekt klasy CSolidHopsView. Twierdzisz, że w trakcie błędu tablica bod jest wyzerowana, choć nie powinna. Dlatego ważne jest pytanie, jaki obiekt przypisujesz wskaźnikowi view2. Takie akcje często dzieją się wtedy, gdy odwołujesz się do obiektu, który został zniszczony, ponieważ był np. tymczasowy (czasami po usunięciu obiektu dostęp do jego pól jest możliwy, chociaż zawartość może być zmieniona).

 

A może odwołujesz się do innego obiektu niż ten, który wypełniasz poprawnymi danymi. Sprawdź adresy.

komentarz 2 września 2017 przez wojtekd09 Początkujący (260 p.)

No właśnie źle się odwoływałem do tego obiektu, bo CSolidHoopsView to klasa MFC określająca Widok. Te linijki pomogły

CMDIFrameWnd *pFrame =
		(CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;

	CMDIChildWnd *pChild =
		(CMDIChildWnd *)pFrame->GetActiveFrame();

	
	CSolidHoopsView *pView = (CSolidHoopsView *)pChild->GetActiveView();

I dopiero na tym pView można się odwołać do tablicy bod.

Podobne pytania

+1 głos
1 odpowiedź 100 wizyt
0 głosów
0 odpowiedzi 71 wizyt
0 głosów
1 odpowiedź 64 wizyt

88,381 zapytań

136,985 odpowiedzi

305,727 komentarzy

58,644 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...