2012-07-04 67 views
0

它應該複製一個AnimatedSprite。我有第二個想法,它有改變*這個對象的不幸副作用。 使用公共命名方法實現非公共賦值運算符?

如何在沒有副作用的情況下實現此功能?

編輯:

基於新的答案,這個問題確實應該:如何實現與公共非公開賦值操作符命名的方法 沒有副作用 ? (更改標題等)。

public: 
AnimatedSprite& AnimatedSprite::Clone(const AnimatedSprite& animatedSprite) { 
    return (*this = animatedSprite); 
} 

protected: 
AnimatedSprite& AnimatedSprite::operator=(const AnimatedSprite& rhs) { 
    if(this == &rhs) return *this; 

    destroy_bitmap(this->_frameImage); 
    this->_frameImage = create_bitmap(rhs._frameImage->w, rhs._frameImage->h); 
    clear_bitmap(this->_frameImage); 
    this->_frameDimensions = rhs._frameDimensions; 
    this->CalcCenterFrame(); 
    this->_frameRate = rhs._frameRate; 
    if(rhs._animation != nullptr) { 
     delete this->_animation; 
     this->_animation = new a2de::AnimationHandler(*rhs._animation); 
    } else { 
     delete this->_animation; 
     this->_animation = nullptr; 
    } 

    return *this; 
} 
+0

是的,你無意中通過選擇'clone'這個名字來解決這個問題,就像''swap'pre-C++ 11一樣,它在習慣C++中有特定的含義。 –

+0

有沒有得到改變'this',因爲分配改變了它的定義。根據我的更新答案,您可以從您的方法中調用私人分配運算符。 – juanchopanza

+0

@JoeGauterin你有什麼建議我將方法重命名爲? – Casey

回答

1

您可以撥打私人賦值運算符:

public: 
AnimatedSprite& AnimatedSprite::Clone(const AnimatedSprite& animatedSprite) { 
    return (operator=(animatedSprite)); 
} 

沒有避過修改this如果你正在嘗試做的分配

通常,克隆返回一個指針或智能指向新實例的指針:

struct IFoo { 
    virtual IFoo* clone() const = 0; 
}; 
struct Foo1 : public virtual IFoo { 
    virtual IFoo* clone() { return new Foo1(this);} 
}; 
struct Foo2 : public virtual IFoo { 
    virtual IFoo* clone() { return new Foo2(this);} 
}; 

IFoo* foo0 = new Foo1(); 
... 
IFoo* fooClone = foo0.clone(); 

+0

另外,通常情況下,當您在代碼中顯示它時,Clone方法沒有任何參數,只是返回自身的副本 – Ation

0
  1. 克隆不應該有參數,因爲它應該克隆自己。如果你想改變*這你有operator =。
  2. 嘗試返回值。如果您創建臨時對象作爲回報,那麼它可以通過編譯器進行優化來構造新對象而不需要臨時對象。 (* this);這是一個動畫Sprite(*); }

    AnimatedSprite clone = someObject.Clone(); //不會導致創建臨時對象

//編輯

因此,你需要這樣的事?另外我不確定,爲什麼你需要參考返回。

public: 
AnimatedSprite& AnimatedSprite::CopyTo(AnimatedSprite& animatedSprite) { 
    animatedSprite = *this; 
    return *this; 
} 

AnimatedSprite& AnimatedSprite::CopyFrom(AnimatedSprite& animatedSprite) { 
    return (*this = animatedSprite); 
}