Login or Sign up Help | Site Map
Connecting Tech Pros Worldwide

Base class returning children's data

Question posted by: Alessandro [AkiRoss] Re (Guest) on July 4th, 2008 09:25 PM
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 :)
Would you like to answer this question?
Sign up for a free account, or Login (if you're already a member).
Alessandro [AkiRoss] Re's Avatar
Alessandro [AkiRoss] Re
Guest
n/a Posts
July 5th, 2008
12:15 AM
#2

Re: Base class returning children's data
On Jul 4, 11:31*pm, "Alf P. Steinbach" <al...@start.nowrote:
Quote:
Originally Posted by
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

Alessandro [AkiRoss] Re's Avatar
Alessandro [AkiRoss] Re
Guest
n/a Posts
July 5th, 2008
10:15 AM
#3

Re: Base class returning children's data
On Jul 5, 2:54*am, "Alf P. Steinbach" <al...@start.nowrote:
Quote:
Originally Posted by
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 :D

Thanks!

Alessandro [AkiRoss] Re's Avatar
Alessandro [AkiRoss] Re
Guest
n/a Posts
July 5th, 2008
11:05 AM
#4

Re: Base class returning children's data
On Jul 5, 12:35*pm, "Alf P. Steinbach" <al...@start.nowrote:
Quote:
Originally Posted by
* Alessandro [AkiRoss] Re:
>
Quote:
Originally Posted by
On Jul 5, 2:54 am, "Alf P. Steinbach" <al...@start.nowrote:
Quote:
Originally Posted by
Well, then you run into problems if you allow variable data in those properties.

>
Quote:
Originally Posted by
Quote:
Originally Posted by
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,

>
Quote:
Originally Posted by
Thanks for the reply :) It gave me some ideas...

>
Quote:
Originally Posted by
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

 
Not the answer you were looking for? Post your question . . .
184,011 Experts ready to help you find a solution.
Sign up for a free account, or Login (if you're already a member).

Latest Articles: Read & Comment
  • Didn't find the answer you were looking for?
    Post Your Question
  • Top Community Contributors