473,402 Members | 2,050 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,402 software developers and data experts.

templates and polymorphism

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...

Feb 19 '07 #1
8 3755

msc...@gmail.com napsal:
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.

Feb 19 '07 #2
On Feb 19, 1:54 pm, msc...@gmail.com wrote:
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

Feb 19 '07 #3
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.
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...
Feb 19 '07 #4
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
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 ) );


Feb 19 '07 #5
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?

Feb 19 '07 #6
On Feb 19, 6:54 am, msc...@gmail.com wrote:
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.

Feb 19 '07 #7
Ouw! Thanks Paul! Something I'm going to study. I'll try to implement
it by myself. Thanks again.
Feb 19 '07 #8
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?
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


Feb 20 '07 #9

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

5
by: SainTiss | last post by:
Hi, Is there an extra overhead in using virtual functions and templates? Or is is just the same overhead as with regular classes? Either way, if you'd want to avoid it, will you always end up...
5
by: Ray Gardener | last post by:
Would templates be necessary if C++ had all numeric types inherit from a base "number" class and had all types inherit from a base "object" class? (Sorry if this has already been discussed to...
2
by: kelvSYC | last post by:
I'm trying to program something along the lines of a "trading card" idea: I have a single copy of the "card" in the program, yet there may be multiple "instances" of the "card", with differing...
1
by: sapropel | last post by:
ive been trying to understand Inheritance, Polymorphism and templates, and so ive tried to make a test using all of those. it is about a base class taht receives two params on the template and two...
10
by: makc.the.great | last post by:
now that I am looking at templates, there's the question. why same effect couldn't/shouldn't be achieved with inheritance? provided the difference of the two, when and where do I use templates...
4
by: qning88 | last post by:
I would like to find out how I can effectively make use of templates in theexample below. In Class A, I have 3 overloaded member functions "send" for handling the different messages. Although...
2
by: glen stark | last post by:
I have a templated function template<class T> void update_E(T& updateable) { .... } What I would like to do is store a vector of updateable objects, and for each of them call the update...
2
by: sarathy | last post by:
Hi all, I need a small clarification reg. Templates and Polymorphism. I believe templates is really a good feature, which can be used to implement generic functions and classes. But i doubt...
5
by: Zeppe | last post by:
Hi all! my problem is this one, I think that it could be a common one, maybe a pattern, so if you can help me somehow it would be great. Let's suppose I have a class Base class Base { //...
3
by: Johs | last post by:
I have read that when you are using templates you are making generic programs. But I don't see whats so generic about templates. You can make generic programs without templates through the use of...
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
0
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.