[ DDMM @ 28.10.2003. 15:00 ] @
Situacija sledeca:

template< typename _Sadrzaj >
class A
{
public:
A(){}

// ostalo ...

protected:
_Sadrzaj M_sadrzaj;
};

E sad kako da mi taj sadrzaj bude std::vector<A*> ili std::map<std::string, A*> ili bilo sta sto je pokazivac na A ciji je _Sadrzaj opet std::vector<A*> ili std::map<std::string, A*> ili bilo sta sto je pokazivac na A ciji je sadrzaj opet, ... ?

Samo bez nasledjivanja molim.

U pojedinim situacijama treba da je: double , int, string.






[ sspasic @ 28.10.2003. 15:42 ] @
Hm, ako dobro razumem, na kraju od ovakvih struktura dobiješ stablo gde su na različitim nivoima listovi A<int>, A<double>, ...
Ako je ovo slucaj, mislim da nece ici bez nasledjivanja.
[ Dragi Tata @ 28.10.2003. 16:04 ] @
Prvo, da razjasnimo: nema pokazivača na šablone. A* ne postoji. Možeš samo da specijalizuješ šablon i onda da imaš pokazivač na specijalizaciju: A<int>*, A<double>*, itd. Šabloni nisu tipovi.
[ Cybernoid II @ 28.10.2003. 16:13 ] @
Nisam dobro shvatio jel hoćeš nešto kao rekurzivni template?
Probao sam tako nešto i nije dozvoljeno.
Ako je u pitanju compozite design pattern, ne može samo sa jednom klasom već sa 2 i nasleđivanjem.
[ DDMM @ 29.10.2003. 11:20 ] @
sspasic rece i procita mi misli:
Citat:
Hm, ako dobro razumem, na kraju od ovakvih struktura dobiješ stablo gde su na različitim nivoima listovi A<int>, A<double>, ...
Ako je ovo slucaj, mislim da nece ici bez nasledjivanja.


Mada zadatak to ne kaze i to ne trazi. To sam kasnije shvatio.

Zadatak kaze da u slucaju A<double> dobijam obican primerak sablona,
dok u slucaju A< vector<*A> > generalizovani cvor na clana liste, stabla, grafa ili vec kako ocu da to koristim. Da detaljisem klasa mora da ima jos neki podatak.

Kako god previse sam isteoretisao pa sam se zagubio i pogresno postavio zadatak.

A evo i resenja (valjda) za ono sto mi treba:

Code:

class Osnovna
 {
  
 };

template < typename _Sadrzaj>
 class A: public Osnovna
 {
   // ...
 
  _Sadrzaj M_sadrzaj;
 };

typedef A<vector<Osnovna*>>      Cvor_Cvor_vektor;
typedef A<map<string,Osnovna*>> Cvor_Cvor_map;
typedef A<int>                            Cvor_int;
typedef A<double>                       Cvor_double;



Malko nasledjivanja ne smeta ( i mora, svidjalo mi se ili ne ), jer svu pamet ocu da odradim u A pa posle samo da typedef-ujem.
E sad treba biti lukav i videti sta ce biti sa curenjem memorije.


A za ono sto mi ne treba a pitah:

Mora da nesto ovako:
Code:

template < typename _Sadrzaj, typename template<typename _Class> _Container>
 class A
 {
  _Container<_Sadrzaj> M_sadrzaj;
 };


tj. mora da budem bas precizno sta ocu i to dal cu kontejner sa jednim ili dva templejt parametra.
Pa ko sto Dragi Tata kaze morace da padnu specijalizacije ili nesto slicno.

Da zakljucim:
Zahvaljujem na savetima i inspiraciji!

I opet zatrazim: bacite neki link koji se bavi ovakvim ili slicnim problemima.




[Ovu poruku je menjao DDMM dana 29.10.2003. u 17:32 GMT]
[ Cybernoid II @ 29.10.2003. 11:48 ] @
Citat:
DDMM:
E sad treba biti lukav i videti sta ce biti sa curenjem memorije.


U std:: imaš

template<class T>
class auto_ptr {
public:
typedef T element_type;
explicit auto_ptr(T *p = 0) throw();
auto_ptr(const auto_ptr<T>& rhs) throw();
auto_ptr<T>& operator=(auto_ptr<T>& rhs) throw();
~auto_ptr();
T& operator*() const throw();
T *operator->() const throw();
T *get() const throw();
T *release() const throw();
};
The class describes an object that stores a pointer to an allocated object of type T. The stored pointer must either be null or designate an object allocated by a new expression. The object also stores an ownership indicator. An object constructed with a non-null pointer owns the pointer. It transfers ownership if its stored value is assigned to another object. The destructor for auto_ptr<T> deletes the allocated object if it owns it. Hence, an object of class auto_ptr<T> ensures that an allocated object is automatically deleted when control leaves a block, even via a thrown exception.

Dakle sve objekte praviš kao dinamičke sa new a auto_ptr kao scope.

http://cpptips.hyperformix.com/Templates.html
http://roots.dnd.no/2001/speak...elika/PatternsandTemplates.pdf
http://www.ic.unicamp.br/~cmbm/geoinfo/papers/pag93a99.pdf


[ sspasic @ 29.10.2003. 12:30 ] @
auto_ptr ne bi smeo da se koristi za npr. std::vector<std::auto_ptr<NekaKlasa> >.
Razlog je to sto operator= menja i objekat koji se kopira (ne secam se kako se tacno zove ova osobina).
U VC++ 6.0 nece biti problema zato se njegov std::auto_ptr ne ponasa u skladu sa standardom.

Treba koristiti boost:shared_ptr ili nesto slicno ili u destruktoru klase A obrisati sve objekte iz kontejnera.
[ Cybernoid II @ 29.10.2003. 13:26 ] @
U pravu si
Citat:

auto_ptr::operator=

An assignment operator that transfers ownership from one auto_ptr object to another.


Ovo može da predstavlja problem jer operator= obično kopira, a ne preotima sadržaj.

Iako imam VC++ 6.0 sp5 objekte brišem eksplicitno jean po jedan u petlji unutar destruktora ili koristim svoju implementaciju pametnih pokazivača.
U početku sam koristio auto_ptr i nije htelo da radi kako treba kad sam prenosio kod na gcc ili BC.
Imao sam i nekih drugih problema sa MSVC STL koji neke stvari odrađuje na drugačiji (nestandardan) način.

Ima li negde spisak nekompatibilnosti?

[ Dragi Tata @ 29.10.2003. 17:55 ] @
Citat:
DDMM:

I opet zatrazim: bacite neki link koji se bavi ovakvim ili slicnim problemima.



Mislim da će te ovo zanimati:

http://www.informit.com/conten...9FEB-498B-89B1-2CDBC13F7058%7D
[ Reljam @ 29.10.2003. 19:17 ] @
Evo klase koja demonstrira upravo to:

Code:

template <typename T> class MyClass
{
public:
    T value;
    vector<MyClass*> list;
};


Kasnije iz svog koda mozes da uradis ovo:

Code:

    MyClass<int> mc;
    mc.value=5;
    mc.list.push_back(&mc);


Nadam se da je to odgovor na tvoje pitanje.