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

Szablon klasy, dla tablicy wielowymiarowej

Ostatnio zmodyfikowano 2013-08-10 02:02
Autor Wiadomość
Bimbol
Temat założony przez niniejszego użytkownika
» 2013-08-09 16:22:02
Dzięki wielkie Monika :)

Wersja ze wskaźnikiem działa.
C/C++
TYP * operator []( unsigned uIndex )
{
    return m_pTablica;
}

Testowałem na tym przykładzie:
C/C++
TArray < TArray < int > > Array( 1, 1 );
Array( 0, 0 ) = 7;
Array( 0, 1 ) = 8;
cout << Array[ 0 ][ 0 ] << endl;
cout << Array[ 0 ][ 1 ] << endl;

Wszystkie wartości są poprawne. Do zamknięcia.
P-89813
Monika90
» 2013-08-09 19:09:28
C/C++
return m_pTablica;
To nie jest prawidłowe. Choćby dlatego, że igonoruje parametr uIndex. Musisz zwracać adres wiersza o numerze uIndex. Z tym że kolejność indeksów będzie wtedy odwrotna niż w operatorze(x,y) więc w sumie jego też musisz zmienić.

Poza tym, jak zwykle dla takich klas musisz zdefiniować konstruktor kopiujący i operator =
P-89836
Bimbol
Temat założony przez niniejszego użytkownika
» 2013-08-09 20:17:05
Sorry, że piszę tu, ale tamten wątek został przedwcześnie zamknięty.
@Bimbol
Otóż Twoja implemetacja operatora [] dla tablicy dwuwymiarowej jest błędna. Operatora () zresztą też.

Otworzyłem temat Szablon klasy, dla tablicy wielowymiarowej. ~SeaMonster131

Dziękuję :)

Jak pisałem w tamtym temacie, kod specjalizacji tego szablonu należy do autora kursu.

C/C++
return m_pTablica;
To nie jest prawidłowe. Choćby dlatego, że igonoruje parametr uIndex. Musisz zwracać adres wiersza o numerze uIndex. Z tym że kolejność indeksów będzie wtedy odwrotna niż w operatorze(x,y) więc w sumie jego też musisz zmienić.

Poza tym, jak zwykle dla takich klas musisz zdefiniować konstruktor kopiujący i operator =

Dobra, zaraz to zmienię.

EDIT.

Działa, kod:
C/C++
TYP * operator []( unsigned uIndex )
{
    return m_pTablica + uIndex;
}
P-89844
Monika90
» 2013-08-09 21:13:43
Wciąż źle, musisz lepiej testować kod.

C/C++
TYP * operator []( unsigned uIndex )
{
    return & m_pTablica[ uIndex * m_uRozmiarX ];
}
albo to samo inaczej:
C/C++
TYP * operator []( unsigned uIndex )
{
    return m_pTablica +( uIndex * m_uRozmiarX );
}

Ale żeby array(x, y) miało to samo znaczenie co array[x][y], to musisz zmienić kolejność argumentów w operatorze ()
C/C++
TYP & operator ()( unsigned uY, unsigned uX ) { return m_pTablica[ uY * m_uRozmiarX + uX ]; }

dzięki czemu można zaimplementować [] za pomocą za pomocą ():
C/C++
TYP * operator []( unsigned uIndex )
{
    return &( * this )( uIndex, 0 );
}
P-89856
Bimbol
Temat założony przez niniejszego użytkownika
» 2013-08-09 22:09:03
Wciąż źle, musisz lepiej testować kod.

C/C++
TYP * operator []( unsigned uIndex )
{
    return & m_pTablica[ uIndex * m_uRozmiarX ];
}
albo to samo inaczej:
C/C++
TYP * operator []( unsigned uIndex )
{
    return m_pTablica +( uIndex * m_uRozmiarX );
}

Ale żeby array(x, y) miało to samo znaczenie co array[x][y], to musisz zmienić kolejność argumentów w operatorze ()
C/C++
TYP & operator ()( unsigned uY, unsigned uX ) { return m_pTablica[ uY * m_uRozmiarX + uX ]; }

dzięki czemu można zaimplementować [] za pomocą za pomocą ():
C/C++
TYP * operator []( unsigned uIndex )
{
    return &( * this )( uIndex, 0 );
}

Dzięki nie pomyślałem, że adres mogę zwrócić referencją.

EDIT.

Hmm ostatnie rozwiązanie u mnie nie działa.
P-89863
Monika90
» 2013-08-09 22:38:31
Dzięki nie pomyślałem, że adres mogę zwrócić referencją.
Nie wiem, co masz na myśli.
&
 - to jest operator pobrania adresu.

Hmm ostatnie rozwiązanie u mnie nie działa.
Nie działa, czyli co? Może masz złą kolejność argumentów.
P-89864
Bimbol
Temat założony przez niniejszego użytkownika
» 2013-08-10 00:45:15
Nie działa, czyli co? Może masz złą kolejność argumentów.

W ogóle się nie kompiluje.
Zmieniłem kolejność.

Logi:
||=== R11, Z3, Debug ===|
 Z3\main.cpp||In instantiation of 'TArray<TArray<TYP> >::TArray(unsigned int, unsigned int) [with TYP = int]':|
 Z3\main.cpp|125|required from here|
 Z3\main.cpp|91|warning: 'TArray<TArray<int> >::m_uRozmiarY' will be initialized after [-Wreorder]|
 Z3\main.cpp|88|warning:   'int* TArray<TArray<int> >::m_pTablica' [-Wreorder]|
 Z3\main.cpp|95|warning:   when initialized here [-Wreorder]|
 Z3\main.cpp||In instantiation of 'TYP* TArray<TArray<TYP> >::operator[](unsigned int) [with TYP = int]':|
 Z3\main.cpp|130|required from here|
 Z3\main.cpp|118|error: lvalue required as unary '&' operand|
 Z3\main.cpp||In member function 'TYP* TArray<TArray<TYP> >::operator[](unsigned int) [with TYP = int]':|
 Z3\main.cpp|119|warning: control reaches end of non-void function [-Wreturn-type]|
||=== Build finished: 1 errors, 8 warnings (0 minutes, 0 seconds) ===|

P-89869
Monika90
» 2013-08-10 00:51:59
Wygląda na to, że operator () nie zwraca L-wartości, co znaczy że go zmieniłeś, bo w kodzie który zamieściłeś w otwierającym poście zwraca L-wartość. Upewnij się, że typem zwracanym z operatora () jest TYP& a nie TYP. A najlepiej pokaż kod.
P-89870
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona