Wskaźnik z klasy na tablicę obiektów

0

Mam problem z wskaźnikiem, chcę zrobić żeby wskaźnik "pointer" pokazywał na następny obiekt:

#include <iostream>
#include <conio.h>

using namespace std;

class B;

class A
{
public:
	B *pointer;
};

class B
{
public:
	int c;
	B() { c = 0; }
	
};
int main()
{
	A *wsk = new A;
	wsk->pointer = new B[10];
	for (int i = 0; i < 10; i++)
	{
		wsk->pointer->c = i;  // działa ale pokazuje tylko na jeden obiekt
	}

	for (int i = 0; i < 10; i++)
	{
		cout << wsk->pointer->c << endl;  // działa ale pokazuje tylko na jeden obiekt
	}

	_getch();
	return 0;
}

Gdy zamienię wsk->pointer->c = i; na wsk->pointer[i]->c = i; to IDE podpowiada mi że wsk musi mieć typ wskaźnika, jak podpowiem mu robiąc to tak ((A)wsk)->pointer[i]->c = i;, IDE nadal nie zmienia zdania podpowiada i nadal nie wie że ((A)wsk) wskazuje na obiekt typu A.

Błąd kompilatora:

1>------ Build started: Project: classpointer and function, Configuration: Debug Win32 ------
1>  Source.cpp
1>c:\users\administrator\documents\visual studio 2013\projects\classpointer and function\classpointer and function\source.cpp(27): error C2819: type 'B' does not have an overloaded member 'operator ->'
1>          c:\users\administrator\documents\visual studio 2013\projects\classpointer and function\classpointer and function\source.cpp(15) : see declaration of 'B'
1>          did you intend to use '.' instead?
1>c:\users\administrator\documents\visual studio 2013\projects\classpointer and function\classpointer and function\source.cpp(27): error C2232: '->B::c' : left operand has 'class' type, use '.'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Proszę o pomoc

1

A nie powinno być tak:

#include <iostream>

using namespace std;

//------------------------

class B;

//------------------------

class A
{
public:
    B *pointer;
};

//------------------------

class B
{
public:
    B() { c = 0; }
    int c;
};

//------------------------

int main()
{
    A *wsk = new A;
    wsk->pointer = new B[10];
    for (int i = 0; i < 10; i++){
        wsk->pointer[i].c = i;
        cout << wsk->pointer[i].c << endl;
    }

    delete[] wsk->pointer;
    delete wsk;
    return 0;
}

Drmemory:

NO ERRORS FOUND:
      0 unique,     0 total unaddressable access(es)
      0 unique,     0 total uninitialized access(es)
      0 unique,     0 total invalid heap argument(s)
      0 unique,     0 total GDI usage error(s)
      0 unique,     0 total handle leak(s)
      0 unique,     0 total warning(s)
      0 unique,     0 total,      0 byte(s) of leak(s)
      0 unique,     0 total,      0 byte(s) of possible leak(s)

Zapomniałeś o operatorze indeksu [ ] w pętlach.
Pokazywało tylko jeden obiekt, ponieważ ten wskaźnik był adresem początku tablicy.
Nie poruszałeś się po całej tablicy tylko po tym jednym adresie.

A no i wywal tego konia ;-)

0

Dzięki. Działa, myślałem że przy wskaźnikach używa się tylko operatora ->. Możesz trochę mi to opisać dlaczego używa się operatora wyłuskania . do wskaźników?

1

Tak jak napisał @grzesiek51114

(wsk->pointer+i)->c

lub

wsk->pointer[i].c

Przy czym używanie nagiego new i delete to zła praktyka i nie powinna być stosowana w nowym kodzie¹. Masz smart pointery i kontenery dostępne w standardzie - używaj ich. Tak jest łatwiej i bezpieczniej.

¹to oczywiście heurestyka, czasem zachodzi potrzeba użycia new/delete, ale bardzo rzadko i na pewno nie w opisywanym wyżej przypadku.

Możesz trochę mi to opisać dlaczego używa się operatora wyłuskania . do wskaźników?

Jeśli a jest wskaźnikiem, to a[i] to cukier syntaktyczny dla *(a+i) (stąd też zapis a[i] jest równoważny i[a]). Po wyłuskaniu masz referencję, a nie wskaźnik, więc używasz operatora.

1

Gwiazdka to operator wyłuskania. Używa się go wtedy kiedy chcesz dostać się do wartości obiektu pokazywanego przez wskaźnik.Wywalenie samego wskaźnika do std::cout (rzutowanego na void*) pokaże Ci tylko jego adres. Jak działa to zaznacz, że problem rozwiązany :)

1

Sama konstrukcja [] "odkodowuje" element. Dlatego nie trzeba juz stosować strzałki, wystarczy normalnie odnieść się do zmiennej za pomocą kropki.

0

Dziękuje wszystkim

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