Próbuję utworzyć tablicę dynamiczną typu „T”, która zawiera tablicę typu „X”. Aby uzyskać dostęp do atrybutów T z X, próbowałem utworzyć wskaźnik w struct X, który wskazuje na T. Oto kod, który mam:
struct WireSeg; // Forward declaration
struct Track { // Type X in above description
int trackNum;
bool used;
WireSeg* parentWireSeg;
};
struct WireSeg { // Type T in above description
int xCoord;
int yCoord;
char flag;
char orientation;
Track* track;
};
typedef WireSeg* WireSegPtr
int main (void) {
WireSegPtr wireSeg;
wireSeg = new WireSeg[5];
for (int i =0; i<5; i++) {
wireSeg[i].track = new Track[3];
for (int j =0; j<3; j++) {
wireSeg[i].track[j].parentWireSeg = wireSeg[i];
}
}
}
Otrzymuję błąd kompilacji:
błąd: nie można przekonwertować „WireSeg” na „WireSeg*” w przypisaniu
Nie rozumiem. parentWireSeg
został zadeklarowany jako wskaźnik typu WireSeg
, a wireSeg[i]
jest również elementem tablicy wireSeg
i jest wskaźnikiem (czyż nie?).
Próbowałem się nim pobawić i zadeklarowałem, że parentWireSeg
jest typu WireSeg
:
struct Track {
int trackNum;
bool used;
bool flag;
WireSeg parentWireSeg;
};
To dało mi błąd:
„struct Track” nie ma członka o nazwie „parentWireSeg”.
Dla mnie to też nie ma sensu, ponieważ struct Track
ma parentWireSeg
jako element! Czy ktoś może to wyjaśnić? Czy nie mogę mieć wskaźnika w Track
, który wskazuje na WireSeg
?
Prawdopodobnie mogę do tego użyć dziedziczonych klas (czy mogę?), ale wolałbym, aby ktoś powiedział mi, co jest nie tak z moją metodą?
2 odpowiedzi
Spróbuj zmienić wiersz, w którym wykonujesz zadanie, na:
wireSeg[i].track[j].parentWireSeg = &wireSeg[i];
Widzisz, wireSeg jest typu WireSeg*
, więc kiedy wyłuskujesz go, wykonując *wireSeg
lub wireSeg[0]
lub wireSeg[i]
, otrzymasz coś, co jest typu WireSeg
. Jeśli chcesz adres obiektu zamiast samego obiektu, aby móc utworzyć wskaźnik, musisz dodać operator adresu (&).
wireSeg[i] jest również elementem tablicy wireSeg i jest wskaźnikiem (czyż nie?).
Nie, wireSeg[i]
to wireSeg
, a nie wskaźnik do wireSeg
.
Na przykład, gdybyś miał int foo[4] = {1, 2, 3, 4}
, to foo[0]
byłoby int
, a nie int *
, prawda?
Potrzebujesz &wireSeg[i]
, aby uzyskać wskaźnik; lub po prostu wireSeg + i
, ponieważ wireSeg
może być traktowany jako wskaźnik, a dodanie i
jest tym samym, co uzyskanie adresu elementu i
.
Podobne pytania
Nowe pytania
c++
C ++ to język programowania ogólnego przeznaczenia. Pierwotnie został zaprojektowany jako rozszerzenie C i ma podobną składnię, ale teraz jest to zupełnie inny język. Użyj tego tagu w przypadku pytań dotyczących kodu (który ma zostać) skompilowany za pomocą kompilatora C ++. Użyj znacznika specyficznego dla wersji w przypadku pytań związanych z określoną wersją standardu [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] lub [C ++ 23] itp. .