Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > Base class returning children's data

Reply
Thread Tools

Base class returning children's data

 
 
Alessandro [AkiRoss] Re
Guest
Posts: n/a
 
      07-04-2008
Hello,
I'm trying to to this: all classes of a hierarchy have a property,
which is a constant object shared between each class. I'd like to have
one function for getting that object, but each class should initialize
that object once.

For example, given the property of type Property, we have that:

class Object {
public:
const Property getP() const { return _p; }
private:
static Property _p;
}, o1, o2;

Property Object::_p = Property("Object's Prop");

class Widget : public Object {
// We don't want to redeclare all here
};
Property Widget::_p = Property("Widget's Prop");

In this way, we use the code of getP which returns always a given
static variable, but the "pointed variable" changes when accessing to
a certain class:

Object *o = new Object, *w = new Widget;
o->getP() // Object's prop
w->getP() // Wdiget's prop

The reason why I'm trying to do this is that the getP member function
may change it's way to produce the result, and it must be consistent
between all derived objects, even if it changes. So I'm trying to
reduce code localizing it in just one place.
For example, assume that we have multiple properties and that getP
returns a composition of them:
class Object {
...
float getP() const;
static int p1;
static float p2;
}

one version of getP may be:
float Object::getP() const { return p1 + p2; }

but later, it may change in:
float Object::getP() const { return p1 + 100 * p2; }

and clients shouldn't never notice this change, they just have to
handle class' properties, and never touch this function.

Actually, I'm thinking about static and virtuals, but I can't find a
proper way to do this. Maybe with templates it's also feasible. Also,
please address me to any pattern which may suit this case, I'm sorry
but I don't know many patterns.

Thanks
 
Reply With Quote
 
 
 
 
Alessandro [AkiRoss] Re
Guest
Posts: n/a
 
      07-05-2008
On Jul 4, 11:31*pm, "Alf P. Steinbach" <(E-Mail Removed)> wrote:
> In
>
> * * float Object::getP() const { return p1 + 100 * p2; }
>
> should a derived class be able to override the p1 and p2?


Yes, because each property remains equal for each class.
Think about that properties as static constant, for example as would
be class "name" perperty:
Base::name == "Base"
Derived::name == "Derived"
Integer::name == "Integer"

Every class has a name, and every object would like to access to its
class name using, for example
this->myName()
which return the
static const char *name
defined for object's class.

Thanks
 
Reply With Quote
 
 
 
 
Alessandro [AkiRoss] Re
Guest
Posts: n/a
 
      07-05-2008
On Jul 5, 2:54*am, "Alf P. Steinbach" <(E-Mail Removed)> wrote:
> Well, then you run into problems if you allow variable data in those properties.
>
> But putting that aside (just don't have that), it seems that what you're after
> is the old concept of meta-class, like, off the cuff,


Thanks for the reply It gave me some ideas...

I'd prefer to avoid meta-classes, it seems a little code bloat to me
for such an easy (?) task. What about this? It seems to work, but...
Is it correct and safe?

class Base {
// This is the function I'd like to write only once
const int get() { return val() * 100 + 5; }
private:
virtual int val() {
static const int myVal = 10;
return myVal;
}
};

class Deri: public Base {
private:
virtual int val() {
static const int myVal = 20;
return myVal;
}
};


int main(int argc, char **argv) {
Base *o1 = new Base(),
*o2 = new Deri();

cout << "O1 val: " << o1->get() << endl
<< "O2 val: " << o2->get() << endl;
return EXIT_SUCCESS;
}

I mean, get() will always refer to polymorphic (overwritten virtual)
val()?
Actually I'm having some difficulties in figuring out *why* this
works

Thanks!
 
Reply With Quote
 
Alessandro [AkiRoss] Re
Guest
Posts: n/a
 
      07-05-2008
On Jul 5, 12:35*pm, "Alf P. Steinbach" <(E-Mail Removed)> wrote:
> * Alessandro [AkiRoss] Re:
>
> > On Jul 5, 2:54 am, "Alf P. Steinbach" <(E-Mail Removed)> wrote:
> >> Well, then you run into problems if you allow variable data in those properties.

>
> >> But putting that aside (just don't have that), it seems that what you're after
> >> is the old concept of meta-class, like, off the cuff,

>
> > Thanks for the reply It gave me some ideas...

>
> > I'd prefer to avoid meta-classes, it seems a little code bloat to me
> > for such an easy (?) task. What about this? It seems to work, but...
> > Is it correct and safe?

>
> It seems to be formally correct (disclaimer: haven't compiled).
>
> However it's just plain ordinary direct dynamic polymorphism.


Ok then, and thanks for the advices!
Also thanks for the meta-class concept, it may be useful in future

Bye
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Base class method Need base class value Karan Rajput Ruby 2 12-22-2010 04:47 PM
base class public type (non template and template base class) Hicham Mouline C++ 1 04-20-2009 03:28 PM
Access of base class' private base class: qualification required, why Alf P. Steinbach C++ 6 09-03-2005 04:03 PM
Returning ptr to a virtual member function of a base class Dave Rahardja C++ 3 12-20-2004 04:50 AM
Virtual function 'BasicMidReader::~BasicMidReader()' conflicts with base class 'base 'TMemoryStream' tomek C++ 2 12-01-2003 06:31 AM



Advertisments