Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Szablony i dziedziczenie, a zmienne

Ostatnio zmodyfikowano 2013-08-07 12:17
Autor Wiadomość
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:
C/C++
#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(const TArray& aTablica)
            {
                m_uRozmiar = aTablica.m_uRozmiar;
                m_pnTablica = new TYP [m_uRozmiar];
                memcpy (m_pnTablica, aTablica.m_pnTablica, m_uRozmiar * sizeof(TYP));
            }*/
    ~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 & );
    /*TArray& 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 > 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?
P-89650
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.
P-89651
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
C/C++
using BaseClass::member;
 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.
P-89670
pekfos
» 2013-08-07 12:17:03
To nie dotyczy przestrzeni nazw.
P-89673
« 1 »
  Strona 1 z 1