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. TYP * operator []( unsigned uIndex ) { return m_pTablica; } Testowałem na tym przykładzie: 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. |
|
Monika90 |
» 2013-08-09 19:09:28 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 = |
|
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ż.
Dziękuję :) |
Jak pisałem w tamtym temacie, kod specjalizacji tego szablonu należy do autora kursu. 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: TYP * operator []( unsigned uIndex ) { return m_pTablica + uIndex; } |
|
Monika90 |
» 2013-08-09 21:13:43 Wciąż źle, musisz lepiej testować kod. TYP * operator []( unsigned uIndex ) { return & m_pTablica[ uIndex * m_uRozmiarX ]; }
albo to samo inaczej: 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 () TYP & operator ()( unsigned uY, unsigned uX ) { return m_pTablica[ uY * m_uRozmiarX + uX ]; }
dzięki czemu można zaimplementować [] za pomocą za pomocą (): TYP * operator []( unsigned uIndex ) { return &( * this )( uIndex, 0 ); }
|
|
Bimbol Temat założony przez niniejszego użytkownika |
» 2013-08-09 22:09:03 Wciąż źle, musisz lepiej testować kod.
TYP * operator []( unsigned uIndex ) { return & m_pTablica[ uIndex * m_uRozmiarX ]; }
albo to samo inaczej:
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 ()
TYP & operator ()( unsigned uY, unsigned uX ) { return m_pTablica[ uY * m_uRozmiarX + uX ]; }
dzięki czemu można zaimplementować [] za pomocą za pomocą ():
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. |
|
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. |
|
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) ===| |
|
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. |
|
1 « 2 » 3 |