Connecting Tech Pros Worldwide Forums | Help | Site Map

templates and polymorphism

mscava@gmail.com
Guest
 
Posts: n/a
#1: Feb 19 '07
I've created CoutedPtr<Ttype to be able o track how many times
pointer is being reference( for garbage collecting ). The problem is
that the polymorphism doesn't work. e.g. CountedPtr<Bitmap!=
CountedPtr<Resourcealthough Bitmap IS Resource( I mean class
Bitmap : public Resource ). How can I go around this obstacle? If you
need more code just tell me...


Ondra Holub
Guest
 
Posts: n/a
#2: Feb 19 '07

re: templates and polymorphism



msc...@gmail.com napsal:
Quote:
I've created CoutedPtr<Ttype to be able o track how many times
pointer is being reference( for garbage collecting ). The problem is
that the polymorphism doesn't work. e.g. CountedPtr<Bitmap!=
CountedPtr<Resourcealthough Bitmap IS Resource( I mean class
Bitmap : public Resource ). How can I go around this obstacle? If you
need more code just tell me...
Typical aproach is to create CountedPtr<BaseType>. I suppose you have
to provide raw pointer to BaseTypeto constructor of
CountedPtr<BaseType>. So it is simple, just use pointer to derived
type:

class BaseType
{
// Some declarations
};

class DerivedType: public BaseType
{
// Some declarations
};

CountedPtr<BaseTypep = new DerivedType;

And you have polymorphis.

peter koch
Guest
 
Posts: n/a
#3: Feb 19 '07

re: templates and polymorphism


On Feb 19, 1:54 pm, msc...@gmail.com wrote:
Quote:
I've created CoutedPtr<Ttype to be able o track how many times
pointer is being reference( for garbage collecting ). The problem is
that the polymorphism doesn't work. e.g. CountedPtr<Bitmap!=
CountedPtr<Resourcealthough Bitmap IS Resource( I mean class
Bitmap : public Resource ). How can I go around this obstacle? If you
need more code just tell me...
If every class gets counted properly, and Bitmap is a Resource, then
CountedPtr<BitMap<= CountedPtr<Resource>, where the comparison will
be < unless Bitmap is the only Resource instantiated.
If that is not the case, I assume there is some problem with your
code. If you are using the curiously recurring template pattern your
"example" above misses something. It should be something like:
Bitmap : public Resource, public CountedPtr<BitMap{...
(I assume that in other uses of CountedPtr<you meant e.g.
CountedPtr<BitMap>::value)

/Peter

mscava@gmail.com
Guest
 
Posts: n/a
#4: Feb 19 '07

re: templates and polymorphism


Typical aproach is to create CountedPtr<BaseType>. I suppose you have
Quote:
to provide raw pointer to BaseTypeto constructor of
CountedPtr<BaseType>. So it is simple, just use pointer to derived
type:
>
class BaseType
{
// Some declarations
>
};
>
class DerivedType: public BaseType
{
// Some declarations
>
};
>
CountedPtr<BaseTypep = new DerivedType;
>
And you have polymorphis.
Problem is that this way CountedPtr will loose it's meaning, when I
will be assigning raw pointer. The action I want to solve is
CountedPtr<Bitmap= CountedPtr<Resource>. And this makes me think of
implementing somehow dynamic_cast...


mscava@gmail.com
Guest
 
Posts: n/a
#5: Feb 19 '07

re: templates and polymorphism


If every class gets counted properly, and Bitmap is a Resource, then
Quote:
CountedPtr<BitMap<= CountedPtr<Resource>, where the comparison will
be < unless Bitmap is the only Resource instantiated.
If that is not the case, I assume there is some problem with your
code. If you are using the curiously recurring template pattern your
"example" above misses something. It should be something like:
Bitmap : public Resource, public CountedPtr<BitMap{...
(I assume that in other uses of CountedPtr<you meant e.g.
CountedPtr<BitMap>::value)
>
/Peter
Well here is more exact code:

vector< CountedPtr<Bitmap vec;
// Function in my ResourceManager
CounterPtr<ResourceGet( string& key )
// This is the line where compiler says it want to get Bitmap passed,
not Resource
vec.push_back( RCM::Get( myKey ) );




mscava@gmail.com
Guest
 
Posts: n/a
#6: Feb 19 '07

re: templates and polymorphism


I feel like I should formulate it otherwise. Can I cast templates?

With normal pointers I would do:

Bitmap* b;
Resource* r = new Resource;
b = dynamic_cast<Bitmapr;

But what if I want to do it with CountedPtr<T>?

CountedPtr<Bitmap= CountedPtr<Resource>; is not valid...

Is there a way go around this?

paul.joseph.davis@gmail.com
Guest
 
Posts: n/a
#7: Feb 19 '07

re: templates and polymorphism


On Feb 19, 6:54 am, msc...@gmail.com wrote:
Quote:
I've created CoutedPtr<Ttype to be able o track how many times
pointer is being reference( for garbage collecting ). The problem is
that the polymorphism doesn't work. e.g. CountedPtr<Bitmap!=
CountedPtr<Resourcealthough Bitmap IS Resource( I mean class
Bitmap : public Resource ). How can I go around this obstacle? If you
need more code just tell me...
Check out boost's shared_ptr
http://www.boost.org/boost/shared_ptr.hpp

Specifically boost::dynamic_pointer_cast

and

shared_ptr::operator=( const shared_ptr& rhs )

This is some pretty detail oriented stuff. I'd recommend using boost's
implementation of shared_ptr's to create garbage collection.

mscava@gmail.com
Guest
 
Posts: n/a
#8: Feb 19 '07

re: templates and polymorphism


Ouw! Thanks Paul! Something I'm going to study. I'll try to implement
it by myself. Thanks again.


Patrik Kahari
Guest
 
Posts: n/a
#9: Feb 20 '07

re: templates and polymorphism


With normal pointers I would do:
Quote:
>
Bitmap* b;
Resource* r = new Resource;
b = dynamic_cast<Bitmapr;
>
But what if I want to do it with CountedPtr<T>?
>
CountedPtr<Bitmap= CountedPtr<Resource>; is not valid...
>
Is there a way go around this?
Hi.

If Resource is a base class of the derived class Bitmap then the above
example should always fail. (As in a resource is not a bitmap. A
bitmap is a resource. Maybe you meant to write 'Resource* r = new
Bitmap' on the second line, then the example would make sense.)

However if you wanted to allow assignemnt the other way, from wrapper
of derived pointer to wrapper of base pointer.. as in
CountedPtr<Resource*= CountedPtr<Bitmap*>
just as there is an imlicit conversion from a naked derived pointer to
a base pointers. as in
Resource* = Bitmap*

Then you can overload the CountedPtr copy constructor to do just
that.

<CODE>

template <class T>
struct CountedPtr {

CountedPtr(T t):t_(t) {}

template <class T1>
CountedPtr(CountedPtr<T1&t1):t_(t1.t_) {} // copy constructor for
different template type. So CountedPtr<T1to CountedPtr<Twill work
if there is a conversion from T1 to T

T t_;
};


struct Base{};
struct Derived: public Base {};

inline void Test() {
CountedPtr<Base*cb(0);
CountedPtr<Derived*cd(0);
cb = cd; // works
}

</CODE>

Regards Patrik




Closed Thread