Witam.
Mam napisać na zajęcia program z okropną konstrukcją - macierz dziedziczy po wektorze...
no ale do rzeczy.
Klasa Vec ma:
int n - ile współrzędnych
double* A - współrzędne
i inne mniej ważne bzdury
Klasa Mac ma:
int n - ile elementów - odziedziczone po Vecu
double* A - elementy (jednowymiarowe!) - po Vecu
poza tym co ma swoje to:
int P, Q - ile rzędów i wierszy - czyli taki "sztuczny" podział tablicy jednowymiarowej na dwa wymiary.
I teraz żeby móc trzymać wszystkie obiekty w jednej tablicy, mam klasę TableManager, która ma:
int k - ilość wektorów/macierzy (dla uproszczenia nazywam je potem tablicami (table))
Vec** tables - dynamiczna tablica wskaźników na wektory.
Właśnie to, że to tablica wskaźników, daje mi możliwość wsadzania tam też macierzy. Czyli de facto jest to tablica na moje 'tables'.
Jako że Vec** tables (razem z int k) jest ukryta w sekcji prywatnej (i ma być), dostaję się do niej za pomocą operatora indeksu.
Vec& TableManager::operator[](int i)const //na razie bez wstawiania do tablicy
{
.
.
.
}
W środku potrzebuję sprawdzić, czy element z i-tego indeksu tables jest tak naprawdę wektorem, czy też macierzą. Wiem że na strumieniach dało się zrobić coś takiego:
istream& input;
.
.
.
if (&input == &cin)
{
...
}
I to działa. Nie wiem jak to zrobić na wskaźnikach, w mojej sytuacji. Da się? Jeżeli tak to jak? Jeżeli nie, to jak to inaczej zrobić?
To była pierwsza rzecz.
Druga:
TableManager(TableManager &tableManager)
{
k = tableManager.k;
for (int i = 0; i < k; i++)
{
*tables[i] = *tableManager.tables[i];
}
}
To jest konstruktor kopiujący TableManagera.
Nie jestem pewien, ale mam wątpliwości co do tego czy działa tak, jakbym chciał. Naturalnie ma on skopiować, czyli przepisać każdą 'table' z jednej tablicy do drugiej, a nie ustawiać wskaźniki na to samo. Jeżeli się nie mylę, operator * stojący przed czymś, co jest wskaźnikiem to operator wyłuskania. Czyli zwraca obiekt/zmienną, na którą pokazuje wskaźnik. jako że tables jest tablicą wskaźników, to oczekuję, że po tej instrukcji w forze właśnie obiekty zostaną przekopiowane. "Do tego na co pokazuje wskaźnik tables[i] (*tables[i]
) skopiuj to, na co pokazuje wskaźnik tableManager.tables[i] (*tableManager.tables[i]
)". Niestety, o ile dobrze pamiętam (a nie jestem w stanie teraz tego sprawdzić), to działało dokładnie tak, jak właśnie nie chciałem, aby działało. Jak temu zaradzić?
Teraz tak: mam w Vecu mieć operator indeksacji - zwraca on i-tą współrzędną wektora.
W Mac też ma być taki operator - tyle że zwraca on cały i-ty wiersz jako dynamiczną tablicę doubli (dzięki temu można np. odnieść się do macierzy m[i][j], pierwsze to indekser, drugie jest już na tablicy doubli)