Przesłonięcie wskaźnika z klasy podstawowej

2013-04-08 18:58

Rejestracja: 9 lat temu

Ostatnio: 6 lat temu

0

Witam. Mam następujący problem:

Posiadam zdefiniowaną klasę Macierz, jest w niej wskaźnik na wskaźnik na int

int **macierz; 

Dalej stworzyłem funkcję wyświetlającą jakiś wiersz tej macierzy void Macierz::WyswietlWiersz(int x)
{
x--; // konwersja na zapis indeksowy
if (x >= W || x < 0) { cout << "\nNieprawidlowy wiersz!"; return; }
for (int j = 0; j < K; j++) cout << macierz[x][j] << " ";
cout << endl;
}


Następnie stworzyłem próbną klasę MacierzX, która jest pochodną od klasy Macierz, ze wskaźnikiem na char 
```cpp
 char** macierz;

W funkcji głów zdefiniowałem zmienną m1 typu MacierzX i zainicjalizowałem jakimiś znakami typu char. Gdy teraz próbuję wywołać metodę m1.WyswietlWiersz(x); próbuje mi się ona dostać do tej metody, ale przez wskaźnik int**.

Czy istnieje jakiś sposób, żeby

char **macierz

przesłonił int **macierz

, tak żeby dla <code class="cpp"> cout << macierz[x][j]

wykonywana była metoda ze wskaźnikiem char z klasy pochodnej? Czy muszę zdefiniować przesłonić wszystkie metody w klasie pochodnej (co wydaje mi się trochę absurdalne, zważywszy na fakt, że chodzi tu tylko o odniesienie się do właściwego wskaźnika)?

Proszę o pomoc.

Pozostało 580 znaków

2013-04-08 19:15

Rejestracja: 14 lat temu

Ostatnio: 3 minuty temu

0

Poczytaj na temat wzorców (template).


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2013-04-08 19:42

Rejestracja: 9 lat temu

Ostatnio: 6 lat temu

0

Niestety nie wyrobię się z ogarnięciem tego do jutra, więc potrzebuję szybszego rozwiązania :) (aczkolwiek poczytam o tym jak tylko będę miał trochę więcej czasu)

Pozostało 580 znaków

2013-04-08 19:58
Moderator

Rejestracja: 16 lat temu

Ostatnio: 1 godzina temu

0

No to masz problem bo w takiej sytuacji stosuje się typy generyczne a nie dziedzicznie i już.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2013-04-08 20:03

Rejestracja: 9 lat temu

Ostatnio: 6 lat temu

0

Ok :) Tak właśnie kombinowałem w tę stronę, ale niestety brak mi wiedzy. Spróbuję znaleźć inne rozwiązanie/dziedziczenie.

Pozostało 580 znaków

2013-04-08 20:16
Moderator

Rejestracja: 16 lat temu

Ostatnio: 1 godzina temu

0

Ale po co?

template<typename T>
class Macierz
{
    T** macierz; 
// itd
};

zamieniasz wszędzie w kodzie swoje "int" oznaczające komórkę macierzy na "T" a potem robisz

Macierz<int> macierz_intow;
Macierz<char> macierz_charow;

i voila


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 1x, ostatnio: Shalom, 2013-04-08 20:17
"... i voila" ... masz błędy co drugi wiersz programu, poprawić które potrafisz dopiero po przynajmniej podstawowym zrozumieniu wzorców. - _13th_Dragon 2013-04-08 20:37
Przesadzasz. Jeśli te klasy są sensownie napisane to problemów byc nie powinno :) - Shalom 2013-04-08 21:01
nic nie przesadzam, zapisz sobie konstruktor kopiujący tej klasy w wersji poza klasą (ciało możesz sobie darować) spójrz na niego i powiedz sobie skąd początkujący bez podstawowego zrozumienia wzorców ma się domyślić gdzie mają być nawiasy ostre a gdzie nie. Oczywiście pomijając opcje: szczęśliwy traf i urodzony geniusz. ;P - _13th_Dragon 2013-04-08 21:17

Pozostało 580 znaków

2013-04-08 20:51

Rejestracja: 9 lat temu

Ostatnio: 6 lat temu

0

Skorzystam na przyszłość ;) Okazało się, że moje zadanie nie wymaga aż takiej ogólności :) Ale dziękuję serdecznie, faktycznie jest to bardzo dobre rozwiązanie.

Pozostało 580 znaków

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