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

Przypisanie klasy z const'em

Ostatnio zmodyfikowano 2014-11-19 20:23
Autor Wiadomość
wiktor12348
Temat założony przez niniejszego użytkownika
Przypisanie klasy z const'em
» 2014-11-19 19:19:09
Witam,

Info: Program jest na zaliczenie, ma być tak a nie inaczej bo wymaga tego prowadzący.

Konkrety: Mam klasę w której muszę mieć zmienną const. Dodałem jakąś (która zasadniczo nie robi nic), dodatkowo program na działać na pojedynczym wskaźniku, tablicy wskaźników i tablicy wskaźników na obiekt. Wszystko ma być zarządzane dynamiczne.

Klasa
C/C++
Class Osoba {
    ...
    const int A;
public:
    Osoba( int, int, int );
    Osoba();
}
Definicje:
C/C++
Osoba::Osoba()
    : A( 0 )
{ };
Osoba::Osoba( int a, int b, int c )
    : Wiek( a )
     , Waga( b )
     , Wzrost( c )
     , A( 0 )
{ };

Mam funkcje globalne które mają dynamicznie zarządzać pamięcią. Przykład takiej na tablice wskaźników na obiekt, która dodaje kolejno obiekty:
C/C++
void create( Osoba **& k, int & n ) {
    Osoba ** tmp = new Osoba *[ n + 1 ];
   
    if( n > 0 ) {
        for( int i = 0; i < n; i++ ) {
            tmp[ i ] = k[ i ];
        }
        tmp[ n ] = new Osoba;
        tmp[ n ]->Set();
        delete[] k;
    }
    else {
        tmp[ n ] = new Osoba;
        tmp[ n ]->Set();
    }
    k = tmp;
    n++;
}
Program się kompiluje nie zauważyłem błędów.

Teraz stworzyłem funkcje która robi to samo ale na tablicy wskaźników.
C/C++
void create( Osoba *& k, int & n ) {
    Osoba * tmp = new Osoba[ n + 1 ];
   
    if( n > 0 ) {
        for( int i = 0; i < n; i++ ) {
            tmp[ i ] = k[ i ]; // Błąd: no operator "=" matches these operands operand types are: Osoba
        }
        tmp[ n ].Set();
        delete[] k;
    }
    else {
        tmp[ n ].Set();
    }
    k = tmp;
    n++;
}

Najprawdopodobniej muszę przeładować operator, jednak czy mogę to zrobić bez tego? Robię gdzieś głupi i podstawowy błąd.
P-120999
Monika90
» 2014-11-19 19:42:01
Mam klasę w której muszę mieć zmienną const.
Tego się raczej nie robi, bo uniemożliwa to kompilatorowi automatyczne wygenerowanie operatora przypisania. No chyba że klasa i tak ma być niekopiowalna z takich czy innych przyczyn, to wtedy można.


Teraz stworzyłem funkcje która robi to samo ale na tablicy wskaźników.
C/C++
void create( Osoba *& k, int & n ) {
    Osoba * tmp = new Osoba[ n + 1 ];
Na tablicy wskaźników? new Osoba[ n + 1 ] tworzy tablicę Osób, nie wskaźników.


C/C++
tmp[ i ] = k[ i ]; // Błąd: no operator "=" matches these operands operand types are: Osoba
No właśnie nie ma operatora przypisania, najprościej będzie go zdefiniować samemu.

Można też alokować niezainicjalizowaą pamięć i tworzyć w niej obiekty za pomocą placement new i konstruktora kopiujacego, ale to jest skomplikowane moim zdaniem.
P-121002
wiktor12348
Temat założony przez niniejszego użytkownika
» 2014-11-19 20:01:04
No właśnie nie ma operatora przypisania, najprościej będzie go zdefiniować samemu.
Ok, czyli wycofam się z tego. Bo mamy nie używać przeładować operatorów a musi być const. Nie wiem jak w inny sposób to połączyć. W pierwszym przypadku funkcji create() nie wyrzuca błędy w drugim tak.

Na tablicy wskaźników? new Osoba[ n + 1 ] tworzy tablicę Osób, nie wskaźników.
Według osoby z którą mam zajęcia to:
C/C++
Osoba * klasa = new Osoba;
Pojedynczy wskaźnik;
C/C++
Osoba * klasa = new Osoba[ 10 ];
Tablica wskaźników.

C/C++
Osoba ** klasa = new Osoba *[ 10 ];
for(..)
     klasa[ index ] = new Osoba;

Tablica wskaźników na obiekt.

Czy to jest poprawne? Nie wiem, ale według mnie dużo rzeczy na tych "zajęciach" jest dziwne...
P-121005
Monika90
» 2014-11-19 20:23:39
Według osoby z którą mam zajęcia to:
C/C++
Osoba * klasa = new Osoba;
Pojedynczy wskaźnik;
C/C++
Osoba * klasa = new Osoba[ 10 ];
Tablica wskaźników.

W obydwu przypadkach zmienna klasa to jest pojedynczy wskaźnik, w piewszym przypadku ten wskaźnik pokazuje na samotny obiekt klasy Osoba, w drugim pzypadku odnosi się do obiektu, który jest piewszym elementem całej tablicy 10 obiektów klasy Osoba. Tablicy wskaźników tam nigdzie nie ma.
P-121014
« 1 »
  Strona 1 z 1