Sunday, 15 March 2015

c++ - From constant object reference to pointer -



c++ - From constant object reference to pointer -

in c++ programme i've base of operations class b , derived classes d1, d2, etc.. i've function taking parameter derived class d1, passed const reference improve performance, instead of passing copy:

void appendderived(const d1& derived) { listofderived.append(d1); }

listofderived list of derived classed, append method following:

void append(base* base) { if (!base) return; m_mylist.append(base->clone()); //clone function defined each derived , does: homecoming new d1(*this); }

because of appendderived takes argument const reference, compiler gives error in append method, because there's no matching function append. solutions i've found following:

change appendderived function to:

void appendderived(d1 derived) { listofderived.append(&derived); }

so passing argument value, performance penalty.

change appendderived function to:

void appendderived(d1* derived) { listofderived.append(derived); }

so passing argument pointer, meaning i've alter function calls appendderived in whole code, drawbacks don't want list here...

create intermediate variable before append:

void appendderived(const d1& derived) { d1 derived_temp = derived; listofderived.append(&derived_temp); }

but seems dirty solution...

do have improve idea?

is broken because passing address of local variable. seems ok, alter function take pointer rather reference. has effect on caller side. is broken in same way 1. is.

so, may utilize solution 2, can pass non-const reference:

void appendderived(d1& derived) { listofderived.append(&d1); }

a few things think about:

append() takes pointer. create sense appendderived() take reference? which 1 of append or appendderived need parameter pointer/reference const? need const in both places, rather non-const suggested above. in other words, alter append to

.

void append(const base* base) { if (!base) return; m_mylist.append(base->clone()); //clone needs const, should be. }

this needs clone() const:

virtual base* clone() const; ^^^^^

c++

No comments:

Post a Comment