2010-10-27 4 views
1

Я использую частное наследование при реализации двух очень родственных классов. using Base::X; очень полезен и элегантен. Тем не менее, я не могу найти элегантное решение для повторного использования функции swap базового класса.Частное наследование и своп

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 «определение s в Const_A::swap» s определение, YUCK!

Есть ли элегантное решение для повторного использования замены частного базового класса?

Есть ли более чистый способ реализовать то, что я пытаюсь сделать здесь (оболочка const для класса)?

+0

вы имели в виду, чтобы вернуть 'iterator' (! Вместо' const_iterator') для 'begin'? В противном случае я не вижу смысла иметь две функции и переопределять функцию в производном классе. –

+0

'std :: vector <> :: begin() -> iterator' и' std :: vector <> :: begin() const -> const_iterator'. Это именно то, что я сделал, и мои классы имеют сходную семантику. Неужели я не понимаю ваш вопрос? –

+0

понял, ты прав. Но что же такое метод 'cbegin'? –

ответ

5

Ну, не могли бы вы просто назвать базовую версию swap?

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

На месте , вы обычно переставить элементы, относящиеся только к Const_A, не A, но так как нет какой-либо в вашем конкретном случае, это все, что вам следует.

+0

'Const_A' не конвертируется в' A'. –

+5

@caspin: да, это: вы * внутри * 'Const_A', а' Const_A' сам знает, что он конвертируется в 'A', даже если остальная часть мира этого не делает. –

3

Вы можете сделать, как с остальными методами:

void Const_A::swap(Const_A& other) { 
    A::swap(other); 
    // here any specifics 
} 
Смежные вопросы