[c++] brak dziedziczenia, oryginaly w kontenerze i nie tylko

0

Cześć :) mam kilka pytań, głównie teoretycznych :)

  1. jak stworzyc klase, ktorej nie da sie dziedziczyc (przypuszczam ze - prywatny konstruktor oraz brak wirtualnego destruktora - ale czy to wszystko :) ?)

  2. jak zrobic by przechowywac w kontenerze stl (np. vector) oryginaly, a nie kopie ?

  • wskazniki - odpadaja (chyba brak mozliwosci kopiowania, co nie ? )
  • referenje odpadaja - dlaczego ?
  • auto_ptr też jest nienajlepszym wyborem (chyba cos dlatego, że przy kopiowaniu tracimy oryginal, prawda ?)

trzeba chyba wlasny inteligentny wskaznik z gleboka kopia i liczacy elementy, tylko jak cos takiego napisac (np. analogicznego dla zwtklego wskzanika dla klasy vector), moze jest na necie jakis przystepmy i latwy w zrozumieniu zarys/przyklad ?

  1. dlaczego nie mozna dziedziczyc po kontenerach stla ?

z gory dzieki
pozdro ;)

0
  1. Troszkę bardziej skomplikowane:
  • tworzysz klasę Finalizator która ma prywatny kontruktor i zaprzyjaźniasz ją ze swoją klasą
  • tworzysz wlasną klasę która dziedziczy wirtualnie z Finalizatora.
    Czemu to działa? Twoja klasa nie ma problemu z wywołaniem konstruktora Finalizatora bo jest zaprzyjaźniona. Klasa dziedzicząca z twojej będzie miała problem, bo z racji dziedziczenia wirtualnego konstruktor klasy Finalizator będzie wołany na początku tworzenia obiektu - czyli z poziomu konstruktora klasy najniżej w hierarchii, który nie ma dostępu do prywatnego konstruktora.
  1. Nie rozumiem jaki jest problem ze wskaźnikami i referencjami.
0

co do odpowiedzi na pierwsze - musze to na spokojnie przemyslec, pewnie jeszcze o cos zapytam ;)

  1. no kopiujac np. vektor zawierajacy wskazniki na cos, mamy dwa wektory pokazujace na fizycznie tylko jeden obiekt -> moze powodowa mase problemow.

z referencjami tez jest cos nie tak, tylko nie moge sobie przypomniec...

auto_ptr podczas kopiowania spowoduje ze ten wektor, ktory kopiowalismy przestanie chyba pokazywac na cos sensownego (tam chyba byla tak rozwiazana wlasnosc z kopiowaniem, ze:

X = Y (X i Y - obiekty auto_ptr)
Y od tąd nie pokazuje juz na nic konkretnego))

A trudno napisac wlasna wersje inteligentnego wskaznika, ktora realizowala by te kopiowania w sposob jaki nam zalezy (np. gleboko kopie, czy jakos inczaej - jak bedzie nam sie podobalo to zaimplememntowac) ?

  1. chyba wykladowca mowil ze po stlu sie nie dziedziczy, ale mozliwe ze cos przekrecilem jesli twierdzicie ze jest to ok
0

A gdzie tu jest napisane, że "twierdzimy że jest to ok"? Bo ja tu niczego o dziedziczeniu po klasach z STL nie widzę. Nie są one do tego zaprojektowane i nie powinno się po nich dziedziczyć.
Co do wskaźnika, gdzieś ostatnio widziałem już pytanie na ten temat... Sprawdź czy clone_ptr nie będzie dla Ciebie rozwiązaniem.

0

no dżejo napisal, ze jest to w miare ok

ale ok, nie powinno sie dziedziczyc :)

1

Dlaczego nie mozna dziedziczyc po kontenerach stl? Mozna, ale kwestja jest taka, ze kompozycja jest lepsza od dziedziczenia.

W twoim przypadku idealnym wskaznikiem inteligentnym jest boost::shared_ptr. Zobacza sobie na www.boost.org.

Pozdrawiam serdecznie

0

A jednak chyba odwrotnie przeczytałem, wybaczcie. :) Jednak kod poniżej zostawię, a "nóż widelec" komuś się przyda. ;)

Hm, o ile dobrze zrozumiałem, to jednak op chodziło o coś innego.

 #include <iostream>
#include <boost/shared_ptr.hpp>
#include "clone_ptr.h"

struct A {
    int data;
};

struct B {
    boost::shared_ptr<A> pA;
    B() : pA(new A) {
        pA->data = 5;
    }
};

struct C {
    A* pA;
};

struct D {
    clone_ptr<A> pA;
    D() : pA(new A) {
        pA->data = 5;
    }
};

int main() {
    B b;
    C c;
    D d;
    c.pA = new A;
    c.pA->data = 5;
    
    B bb(b);
    C cc(c);
    D dd(d);
    bb.pA->data = 20;
    cc.pA->data = 20;
    dd.pA->data = 20;
    
    std::cout << "boost::shared_ptr<A>: " << b.pA->data << "\n"
            << "A*: " << c.pA->data << "\n"
            << "clone_ptr<A>: " << d.pA->data << "\n";
    delete c.pA;
    
    return 0;
}

Wynik:

$ ./cpp.exe
boost::shared_ptr<A>: 20
A*: 20
clone_ptr<A>: 5 

http://codeguru.earthweb.com/cpp/cpp/algorithms/general/article.php/c10407/Clone-Smart-Pointer-cloneptr.htm

1 użytkowników online, w tym zalogowanych: 0, gości: 1