Home » Coding » c++ » "Swap" baseclass of two similar Objects...
"Swap" baseclass of two similar Objects... [message #17398] Sun, 07 October 2007 12:05 Go to next message
clqrq  is currently offline clqrq
Messages: 3
Registered: August 2007
Junior Member
guess you have two classes (A and B) and you have two objects (C1 and
C2) of a class C that is defined as

class C: public A, public B

can I *somehow* swap B of C1 and B of C2? To make myself clearer:
class C1 and C2 both have some area in memory that holds their B-Part
- i guess there must be somewhere in class C1 and C2 a kind of pointer
to that baseclasses. Eg. if you do a (B*) this inside C1 you get it.
What i want to do is swap the pointers.

Is that somehow possible?

thx in advance, .rhavin;)
Re: "Swap" baseclass of two similar Objects... [message #17399 is a reply to message #17398 ] Sun, 07 October 2007 12:47 Go to previous messageGo to next message
Markus Schoder  is currently offline Markus Schoder
Messages: 17
Registered: August 2007
Junior Member
On Sun, 07 Oct 2007 09:05:40 -0700, .rhavin grobert wrote:
> guess you have two classes (A and B) and you have two objects (C1 and
> C2) of a class C that is defined as
>
> class C: public A, public B
>
> can I *somehow* swap B of C1 and B of C2? To make myself clearer: class
> C1 and C2 both have some area in memory that holds their B-Part - i
> guess there must be somewhere in class C1 and C2 a kind of pointer to
> that baseclasses. Eg. if you do a (B*) this inside C1 you get it. What i
> want to do is swap the pointers.
>
> Is that somehow possible?

Most implementations will not hold pointers to the base class objects but
instead aggregate them into one large object -- therefore it is not even
theoretically possible to do what you want.

--
Markus Schoder
Re: "Swap" baseclass of two similar Objects... [message #17400 is a reply to message #17399 ] Sun, 07 October 2007 12:53 Go to previous messageGo to next message
alfps  is currently offline alfps
Messages: 315
Registered: July 2007
Senior Member
* Markus Schoder:
> On Sun, 07 Oct 2007 09:05:40 -0700, .rhavin grobert wrote:
>> guess you have two classes (A and B) and you have two objects (C1 and
>> C2) of a class C that is defined as
>>
>> class C: public A, public B
>>
>> can I *somehow* swap B of C1 and B of C2? To make myself clearer: class
>> C1 and C2 both have some area in memory that holds their B-Part - i
>> guess there must be somewhere in class C1 and C2 a kind of pointer to
>> that baseclasses. Eg. if you do a (B*) this inside C1 you get it. What i
>> want to do is swap the pointers.
>>
>> Is that somehow possible?
>
> Most implementations will not hold pointers to the base class objects but
> instead aggregate them into one large object -- therefore it is not even
> theoretically possible to do what you want.

I think perhaps you misread what the OP wrote although it's not very
clear when he first refers to C1 as an object and then as a class; I'm
assuming C1 and C2 really are objects, of class C.

std::swap( *static_cast<B*>(C1), *static_cast<B*>(C2) );

should then do the trick.

But it's not a good idea.

Class C may impose constraints on its B subobject, that depends on the
additional information present, and so swapping may violate the
constraints present in C and break C's class invariant. It's basically
a slice operation. And slicing is Evil(TM) and should be avoided.

Cheers, & hth.,

- Alf

--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?
Re: "Swap" baseclass of two similar Objects... [message #17404 is a reply to message #17398 ] Sun, 07 October 2007 13:51 Go to previous messageGo to next message
Markus Schoder  is currently offline Markus Schoder
Messages: 17
Registered: August 2007
Junior Member
On Sun, 07 Oct 2007 18:53:42 +0200, Alf P. Steinbach wrote:
> * Markus Schoder:
>> On Sun, 07 Oct 2007 09:05:40 -0700, .rhavin grobert wrote:
>>> guess you have two classes (A and B) and you have two objects (C1 and
>>> C2) of a class C that is defined as
>>>
>>> class C: public A, public B
>>>
>>> can I *somehow* swap B of C1 and B of C2? To make myself clearer:
>>> class C1 and C2 both have some area in memory that holds their B-Part
>>> - i guess there must be somewhere in class C1 and C2 a kind of pointer
>>> to that baseclasses. Eg. if you do a (B*) this inside C1 you get it.
>>> What i want to do is swap the pointers.
>>>
>>> Is that somehow possible?
>>
>> Most implementations will not hold pointers to the base class objects
>> but instead aggregate them into one large object -- therefore it is not
>> even theoretically possible to do what you want.
>
> I think perhaps you misread what the OP wrote although it's not very
> clear when he first refers to C1 as an object and then as a class; I'm
> assuming C1 and C2 really are objects, of class C.

Only the OP would now. I thought the OP wanted to specifically swap
pointers to the base class objects and not the actual content since it
seems obvious that you can swap the content.

> std::swap( *static_cast<B*>(C1), *static_cast<B*>(C2) );

should probably read

std::swap( *static_cast<B*>(&C1), *static_cast<B*>(&C2) );

--
Markus Schoder
Re: "Swap" baseclass of two similar Objects... [message #17409 is a reply to message #17400 ] Sun, 07 October 2007 17:00 Go to previous messageGo to next message
clqrq  is currently offline clqrq
Messages: 3
Registered: August 2007
Junior Member
On 7 Okt., 18:53, "Alf P. Steinbach" <al...@start.no> wrote:
> * Markus Schoder:
>
>
>
> > On Sun, 07 Oct 2007 09:05:40 -0700, .rhavin grobert wrote:
> >> guess you have two classes (A and B) and you have two objects (C1 and
> >> C2) of a class C that is defined as
>
> >> class C: public A, public B
>
> >> can I *somehow* swap B of C1 and B of C2? To make myself clearer: class
> >> C1 and C2 both have some area in memory that holds their B-Part - i
> >> guess there must be somewhere in class C1 and C2 a kind of pointer to
> >> that baseclasses. Eg. if you do a (B*) this inside C1 you get it. What i
> >> want to do is swap the pointers.
>
> >> Is that somehow possible?
>
> > Most implementations will not hold pointers to the base class objects but
> > instead aggregate them into one large object -- therefore it is not even
> > theoretically possible to do what you want.
>
> I think perhaps you misread what the OP wrote although it's not very
> clear when he first refers to C1 as an object and then as a class; I'm
> assuming C1 and C2 really are objects, of class C.


i meant class C: public A, B {...};

before:

C1 = [A1],[B1]
C2 = [A2],[B2]

after:

C1 = [A1],[B2]
C2 = [A2],[B1]

even if B has private stuff.

>
> std::swap( *static_cast<B*>(C1), *static_cast<B*>(C2) );
>
> should then do the trick.
>
> But it's not a good idea.
>
> Class C may impose constraints on its B subobject, that depends on the
> additional information present, and so swapping may violate the
> constraints present in C and break C's class invariant.

C and A are contolled by myself, so i should have a chance to correct
the odds;-)

> It's basically a slice operation. And slicing is Evil(TM) and should be avoided.

I want to be evil ;-)

>
> Cheers, & hth.,
>
> - Alf
>
> --
> A: Because it messes up the order in which people normally read text.
> Q: Why is it such a bad thing?
> A: Top-posting.
> Q: What is the most annoying thing on usenet and in e-mail?
Re: "Swap" baseclass of two similar Objects... [message #17410 is a reply to message #17409 ] Sun, 07 October 2007 17:30 Go to previous message
Gianni Mariani  is currently offline Gianni Mariani
Messages: 153
Registered: July 2007
Senior Member
..rhavin grobert wrote:
> On 7 Okt., 18:53, "Alf P. Steinbach" <al...@start.no> wrote:
....
>> It's basically a slice operation. And slicing is Evil(TM) and should be avoided.
>
> I want to be evil ;-)

I think Alf really meant to say masochistic.
Previous Topic:Initializing inherited protected Members of superclass
Next Topic:What does istream::sync()?
Goto Forum:
  


Current Time: Fri May 16 02:30:00 EDT 2008

Total time taken to generate the page: 0.19594 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 2.7.7.
Copyright ©2001-2007 FUD Forum Bulletin Board Software