[C++] Szablony i dziedziczenie, a zmienne
Ostatnio zmodyfikowano 2013-08-07 12:17
Bimbol Temat założony przez niniejszego użytkownika |
[C++] Szablony i dziedziczenie, a zmienne » 2013-08-07 02:24:07 Witam, mam problem z dziedziczeniem klasy, utworzonej jako szablon.
A dokładniej nie dziedziczy pól chronionych ( protected )
Kod:
#include <iostream> #include <memory.h>
using namespace std;
template < typename TYP > class TArray { static const unsigned DOMYSLNY_ROZMIAR = 5; protected: TYP * m_pnTablica; unsigned m_uRozmiar; public: explicit TArray( unsigned uRozmiar = DOMYSLNY_ROZMIAR ) : m_uRozmiar( uRozmiar ) , m_pnTablica( new TYP[ uRozmiar ] ) { } TArray( const TArray & ); ~TArray() { delete[] m_pnTablica; } TYP Pobierz( unsigned uIndeks ) const { if( uIndeks < m_uRozmiar ) return m_pnTablica[ uIndeks ]; else return 0; } bool Ustaw( unsigned uIndeks, TYP nWartosc ) { if( uIndeks >= m_uRozmiar ) return false; m_pnTablica[ uIndeks ] = nWartosc; return true; } TYP Test( TYP r1 ); unsigned Rozmiar() const { return m_uRozmiar; } TYP & operator []( unsigned uIndeks ) { return m_pnTablica[ uIndeks ]; } TArray & operator =( const TArray & ); };
template < typename TYP > TArray < TYP >::TArray( const TArray & aTablica ) { m_uRozmiar = aTablica.m_uRozmiar; m_pnTablica = new TYP[ m_uRozmiar ]; memcpy( m_pnTablica, aTablica.m_pnTablica, m_uRozmiar * sizeof( TYP ) ); }
template < typename TYP > TArray < TYP >& TArray < TYP >::operator =( const TArray & aTablica ) { delete[] m_pnTablica; m_uRozmiar = aTablica.m_uRozmiar; m_pnTablica = new TYP[ m_uRozmiar ]; memcpy( m_pnTablica, aTablica.m_pnTablica, m_uRozmiar * sizeof( TYP ) ); return * this; }
template < typename TYP > class TDynamicArray : public TArray < TYP > { public: bool ZmienRozmiar( unsigned ); };
Logi:
C:\Users\Patryk Bieniek\Desktop\C++\PDF\Szablony klas\main.cpp||In member function 'bool TDynamicArray<TYP>::ZmienRozmiar(unsigned int)':|
C:\Users\Patryk Bieniek\Desktop\C++\PDF\Szablony klas\main.cpp|75|error: 'm_uRozmiar' was not declared in this scope|
||=== Build finished: 1 errors, 0 warnings (0 minutes, 0 seconds) ===|
Próbowałem z przedrostkiem TDynamicArray<TYP>:: i wtedy działa, jednak wolał bym by nie trzeba było go używać.
Czy da radę coś zrobić, bym nie musiał za każdym razem dopisywać tego przedrostka? |
|
Elaine |
» 2013-08-07 03:07:00 Lepszym "domyślnym" rozwiązaniem w tego typu sytuacjach jest dopisywanie this-> , o czym można się przekonać przy funkcjach wirtualnych, bo Foo::doStuff() w tej sytuacji wywoła (na sztywno!) implementację z klasy Foo, this->doStuff() zachowa się tak, jak normalne wywołanie funkcji wirtualnej.
Takie już uroki C++, bez this-> lub Foo:: przed identyfikatorem nie zadziała, bo sama nazwa zmiennej jest traktowana jako non-dependent name, więc trzeba wymusić traktowanie jako dependent name na jeden z tych sposobów.
Nie chcesz tego powtarzać? Jeśli naprawdę musisz, to możesz się wykręcić przez using BaseClass::member; pod odpowiednim specyfikatorem dostępu. |
|
Bimbol Temat założony przez niniejszego użytkownika |
» 2013-08-07 12:14:42 Nie chcesz tego powtarzać? Jeśli naprawdę musisz, to możesz się wykręcić przez pod odpowiednim specyfikatorem dostępu. |
W tym przypadku właśnie nie chcę naruszać przestrzeni nazw. Czyli najlepszym rozwiązaniem jest użycie wskaźnika this :) Dziękuję za odpowiedź do zamknięcia. |
|
pekfos |
» 2013-08-07 12:17:03 To nie dotyczy przestrzeni nazw. |
|
« 1 » |