On Sep 12, 4:26 pm, James Kanze <james.ka...@gmail.com> wrote:
> On Sep 11, 4:17 pm, Hunk <santosh.udyav...@gmail.com> wrote:
>
> > I ws wondering if there is a way to implement operator+ in case of
> > virtual classes.
>
> In general, polymorphism and operator overloading don't work
> well together; operator overloading requires a value type for
> the return values. (In cases where it is necessary, the
> letter/envelop idiom can be used to may a class with value
> semantics act polymorphically.)
You are right... learnt it the hard way... you say there is some way
in letter/envelop idiom?
For now i have taken the decision to restrict the user to use only +=.
I know this is a very restrictive
way , but for now i know of no other way to tackle the issue
>
>
>
>
>
> > Here's the problem. I have to have a base string class from which two
> > classes (normal char string and a hash string class ) are derived. The
> > two derived classes are template classes specifying the sizes. The
> > base class is a non-template class so that it can be used generically
> > in the interface classes. the design would look like
> > class Base_string {
> > };
> > template<size>
> > class Char_string : Base_string {
> > };
> > template<size>
> > class Hash_string: Base_string{
> > };
> > So that in the interface class of the application he can use just the
> > generic Base_string to access the functions and doesnt have to know
> > whether its a Char or hash string
> > The issue is in implementing the operator+ . Since all the methods are
> > virtual in the base class and it should call the desired methods
> > polymorphically, operator+ is a challenge as it returns a Base_string
> > object
> > So if I have something like
> > Char_string<24> char_string1("Hello");
> > Char_string<24> char_string2("world");
> > Char_string<24> char_result;
> > Base_string* base_a = &char_string1;
> > Base_string* base_b = &char_string2;
> > Base_string* base_r = &char_result;
> > i wouldnt be able to do
> > *base_r = *base_a + *base_b; as the operator+ would return a
> > Base_object?
>
> Just a general question: if I add a Char_string< 16 > and a
> Hash_string< 14 >, what concrete type should the results have?
> This is an important aspect of the problem. But not the only
> aspect. Typically, for addition if there are N different
> derived types, then you have NxN different functions to
> implement, each with potentially a different return type (or
> different rules for determining the return type).
Thats a good question. I would prefer giving a compilation error for
this.
This is for the simple reason that Hash_string data members are
different than
Char_string. So would'nt know which to return
> I'm not sure what the difference is between a Hash_string and a
> Char_string, but for just a single hierarchy, where the derived
> types only differ in length, you can probably work something out
> with templates, e.g.:
The difference in Hash_string and Char_string is that the Hash_string
class has a
hash value computed and stored as a data member. So comparisons are
faster as they
would be comparing integers rather than characters.
The generic base_string is required as for the interface class a
generic version is required.
>
> template< size_t L, size_t R >
> FixedLengthString< L + R >
> operator+( FixedLengthString< L > const& lhs,
> FixedLengthString< R > const& rhs ) ;
>
> Trying to use polymorphism here, however, will not work.
>
> --
> James Kanze (GABI Software) email:james.ka...@gmail.com
> Conseils en informatique orientée objet/
> Beratung in objektorientierter Datenverarbeitung
> 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34- Hide quoted text -
>
> - Show quoted text -
|