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

Przesyłanie własnego obiektu do funkcji

Ostatnio zmodyfikowano 2017-12-07 13:04
Autor Wiadomość
Masterpc16
Temat założony przez niniejszego użytkownika
Przesyłanie własnego obiektu do funkcji
» 2017-12-07 10:51:57
Witam po dwóch latach pracy w javie czas na powrót do c++. Moim zadaniem było napisanie programu który sortuje 10 książek, po tytule, autorze oraz liczbie stron (każde sortowanie osobno), oczywiście mam własną klasę Book. Wszystko u mnie działa :) ale pytanie mam o zwalnianie pamięci.
C/C++
bool bubbleSort( std::vector < Book > & a, Comparator & comparator ) {
    bool swapped; // flag for optimization
    int temp; // helping variable for setting last swap position
    int end = a.size() - 1; // position of last swapping for optimization
   
    for( int i = 0; i < a.size(); i++ ) {
        swapped = false;
        for( int j = 0; j < end; j++ ) {
            if( !comparator.compare( a[ j ], a[ j + 1 ] ) ) { // comparator return true if two object is sorted ascending
                swapped = true;
                temp = j;
                std::swap( a[ j ], a[ j + 1 ] ); // swap two values
            }
        }
       
        end = temp;
        if( !swapped ) break; // if false break the loop no swapping
       
    }
    return true; // if sorted
}
tak wygląda moja klasa która jest odpowiedzialna za sortowanie, przekazuję jej referencję do tablicy oraz referencję do komparatora. Wywołuję ją w następujący sposób
C/C++
vector < Book > books;

books.push_back( * new Book( "Boska Komedia", "Dante Alighieri", 666 ) );
books.push_back( * new Book( "Dawca i przysiegi", "Brandon Sanderson", 2103 ) );
books.push_back( * new Book( "Terapia", "Kathryn Perez", 1530 ) );
books.push_back( * new Book( "Jak zawsze", "Zygmunt Miłoszewski", 1414 ) );
books.push_back( * new Book( "Większość bezwzględna", "Remigiusz Mróz", 1190 ) );
books.push_back( * new Book( "Oskar i Pani Róża", "Eric-Emmanuel Schmitt ", 50268 ) );
books.push_back( * new Book( "Siła, która ich przyciąga", "Brittainy C. Cherry ", 1029 ) );
books.push_back( * new Book( "Ciemna strona", "Tarryn Fisher ", 968 ) );
books.push_back( * new Book( "Pudełko z marzeniami", "Magdalena Witkiewicz, Alek Rogoziński ", 838 ) );
books.push_back( * new Book( "Psiego najlepszego. Był sobie pies na święta", "W. Bruce Cameron ", 660 ) );


bubbleSort( books, * new PageComparator() );
a tak cyszczę pamięć po wektorze
C/C++
for( int i = 0; i < books.size(); i++ ) {
    delete books[ i ];
}
books.clear();

a jak mam wyczyścić pamięć bo obiekcie  ```*new PageComparator()``` ? oraz czy dobrze przekazuję ten obiekt do funckji ? Kod do całego projektu jest na moim githubie gdyby potrzebny był wgląd do innych plików https://github.com/Masterpc96/zadanie_3
P-167683
darko202
» 2017-12-07 11:32:34
przeczytaj
http://cpp0x.pl/kursy​/Kurs-STL-C++​/Kontener-tablicy-std-vector​/119

a tam np.
"Funkcja clear() całkowicie czyści tablicę nie zostawiając w niej żadnego elementu."
P-167684
Monika90
» 2017-12-07 11:44:44

C/C++
delete books[ i ];
To się nie skompiluje, przecież elementami vectora books nie są wskaźniki. A tak w ogóle, nie używaj new bez potrzeby.
P-167686
Masterpc16
Temat założony przez niniejszego użytkownika
» 2017-12-07 12:16:55
mi się kompiluje :) to jak mam dodać nowy obiekt do kontenera?(swoj obiekt bo prymitywy wiem)
Edit:
Poprawiłem tworzenie i czyszczenie kontenera robię to teraz tak:
C/C++
vector < Book > books;

books.push_back( Book( "Boska Komedia", "Dante Alighieri", 666 ) );
books.push_back( Book( "Dawca i przysiegi", "Brandon Sanderson", 2103 ) );
books.push_back( Book( "Terapia", "Kathryn Perez", 1530 ) );
books.push_back( Book( "Jak zawsze", "Zygmunt Miłoszewski", 1414 ) );
books.push_back( Book( "Większość bezwzględna", "Remigiusz Mróz", 1190 ) );
books.push_back( Book( "Oskar i Pani Róża", "Eric-Emmanuel Schmitt ", 50268 ) );
books.push_back( Book( "Siła, która ich przyciąga", "Brittainy C. Cherry ", 1029 ) );
books.push_back( Book( "Ciemna strona", "Tarryn Fisher ", 968 ) );
books.push_back( Book( "Pudełko z marzeniami", "Magdalena Witkiewicz, Alek Rogoziński ", 838 ) );
books.push_back( Book( "Psiego najlepszego. Był sobie pies na święta", "W. Bruce Cameron ", 660 ) );

books.clear();

a co w związku z czyszczeniem pamięci po obiekcie *new PageComparator()
P-167687
Monika90
» 2017-12-07 12:47:03
Nie wiem nic o prymitywach.

Tak można zainicjalizować wektor
C/C++
vector < Book > books =
{
    Book { "Boska Komedia", "Dante Alighieri", 666 },
    Book { "Dawca i przysiegi", "Brandon Sanderson", 2103 },
    Book { "Terapia", "Kathryn Perez", 1530 },
};

A dodać do już istniejącego wektora tak:
C/C++
books.push_back( Book { "Boska Komedia", "Dante Alighieri", 666 } );
P-167688
Masterpc16
Temat założony przez niniejszego użytkownika
» 2017-12-07 12:51:32
@Moika90 poprawiłem już kod a co w związku z czyszczeniem miejsca po obiekcie komparatora?
P-167689
Monika90
» 2017-12-07 12:59:16
C/C++
PageComparator cmp;
bubbleSort( books, cmp );

Jakbyś poprawił inne błędy to mogłoby być tak
C/C++
bubbleSort( books, PageComparator() );

P-167690
Masterpc16
Temat założony przez niniejszego użytkownika
» 2017-12-07 13:04:45
Zrobiłem pierwszym sposobem, dzięki za pomoc :) więcej błędów już chyba nie ma :)
P-167691
« 1 »
  Strona 1 z 1