C ++: как предотвратить загрязнение производных типов частными именами? - PullRequest
14 голосов
/ 07 мая 2020

Сегодня я был шокирован тем фактом, что этот фрагмент кода имеет двусмысленную ссылку на имя:

class A
{
private:
    typedef int Type;
};

class B
{
public:
    typedef int Type;
};

class D : A, B
{
    Type value;//error: reference to 'Type' is ambiguous
};

Хмм! Представьте, что вы являетесь автором класса A, и ваш класс уже везде используется разными людьми и в разных проектах. Однажды вы решите переписать свой класс A. Разве это не означает, что вы не можете использовать какое-либо новое (даже частное) имя в своем новом классе, не нарушая чужой код?

Какое здесь соглашение?

Ответы [ 3 ]

2 голосов
/ 12 мая 2020

Да, вы правы . Использование текущего формата / логики / стиля кодирования может нарушить чужой код, если вы решите внести изменения позже. Попробуйте использовать PIMPL или полностью соответствующие символы. Ваш пример - хороший пример того, почему не использовать полностью квалифицированные символы - не лучшая идея. Та же проблема с кодом вроде:

using namespace std;

Строка кода выше может сломать много вещей.

0 голосов
/ 12 мая 2020

Я не вижу здесь проблемы, потому что символ не существует не потому, что это личное. Если вы попытаетесь получить доступ к закрытому члену, компилятор сообщит вам, что вы не можете получить к нему доступ, а не то, что не существует. .

class D : A, B
{
    B::Type value;
};
0 голосов
/ 07 мая 2020

Как упоминал @ Jarod42, для разделения интерфейса и реализации необходимо следовать pimpl idiom (указатель на реализацию):

Ah

#include <memory>

class A
{
public:    
    A(); 
    ~A();     
private:
    class AImpl; 
    std::unique_ptr<AImpl> pimpl;
};

A. cpp

#include "A.h"

class A::AImpl 
{
private:
    typedef int Type;

    /* .. */
};

A::A(): pimpl(new AImpl)
{
}

A::~A() = default;

основной. cpp

#include "A.h"

class B
{
public:
    typedef int Type;
};

class D : A, B
{
    Type value;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...