2010-10-27 107 views
1

我在使用私有繼承實現兩個非常相關的類。 using Base::X;是非常有用和優雅。但是,我似乎無法找到重用基類交換功能的優雅解決方案。私有繼承和交換

class A 
{ 
public: 
    iterator  begin(); 
    const_iterator begin() const; 
    const_iterator cbegin() const; 

    A clone(); 

    void swap(A& other); 
}; 

class Const_A : private A 
{ 
public: 
    // I think using A::A; will be valid in C++0x 
    Const_A(const A& copy) : A(copy) { } 

    // very elegant, concise, meaningful 
    using A::cbegin; 

    // I'd love to write using A::begin;, but I only want the const overload 
    // this is just forwarding to the const overload, still elegant 
    const_iterator begin() const 
    { return A::begin(); } 

    // A little more work than just forwarding the function but still uber simple 
    Const_A clone() 
    { return Const_A(A::clone()); } 

    // What should I do here? 
    void swap(Const_A& other) 
    { /* ??? */ } 
}; 

到目前爲止,我能想出的唯一事情就是複製粘貼A::swap的定義爲Const_A::swap的定義,YUCK!

是否有一個優雅的解決方案來重用私有基類的交換?

是否有更乾淨的方式來實現我在這裏要做的事情(一個類的常量包裝)?

+0

您的意思是返回'iterator'(!而不是'const_iterator')爲'begin'?否則,我沒有看到有兩個函數的意義,並重寫派生類中的函數。 – 2010-10-27 18:36:57

+0

'std :: vector <> :: begin() - > iterator'和'std :: vector <> :: begin()const - > const_iterator'。這正是我所做的,我的類具有類似的語義。我誤解你的問題嗎? – 2010-10-27 18:54:00

+0

明白了,你是對的。但是,那麼cbegin方法是什麼呢? – 2010-10-27 18:55:57

回答

5

那麼,難道你不能只是調用基地的版本swap

void swap(Const_A& other) 
{ 
    A::swap(other); // swaps the `A` portion of `this`. 
    // … 
} 

在地方,您通常會交換僅與Const_A,不A成員,但由於沒有任何你的具體情況,這是所有你應該需要。

+0

'Const_A'不能轉換爲'A'。 – 2010-10-27 18:38:20

+5

@caspin:是的,它是:你在* Const_A內*,Const_A本身知道它可以轉換爲'A',即使世界其他地方都沒有。 – 2010-10-27 18:39:40

3

你可以做與方法的其餘部分:

void Const_A::swap(Const_A& other) { 
    A::swap(other); 
    // here any specifics 
}