C ++: Использование закрытых членов базового класса в тесте на равенство - PullRequest
1 голос
/ 05 августа 2010

Я бы хотел скомпилировать следующее, но это не так:

template <typename T>
struct Odp
{
public:
    operator*() const
    {
        return m_p;
    }

    T* operator->() const
    {
        return m_p;
    }

    T** operator&()
    {
        return &m_p;
    }

private:
        T* m_p;

};

struct Ftw : public Odp<int>
{
    bool operator==(const Ftw& rhs)
    {
        return m_p == rhs.m_p; // C2248 cannot access private member
    } 
};

Есть ли способ заставить эту работу? Я не могу изменить Odp.

Ответы [ 4 ]

4 голосов
/ 05 августа 2010

Odp перегрузки operator* для возврата m_p. Вы можете вызвать оператора на *this и rhs:

struct Ftw : public Odp<int>
{
    bool operator==(const Ftw& rhs) const
    {
        return **this == *rhs;
    } 
};

Перегрузка operator* немного необычна, однако: вместо этого она, вероятно, должна вернуть *m_p, поскольку operator-> возвращает m_p (это приведет к тому, что ваш класс будет иметь согласованную семантику, похожую на указатель). Если бы вы сделали это, вам пришлось бы сделать следующее для сравнения:

return &**this == &*rhs; // or explicitly as:
return &this->operator*() == &rhs.operator*();

Это становится немного грязно, и это не обязательно будет работать, если унарный & перегружен для T (но, на самом деле, на самом деле не должен этого делать ... ). Вы также можете получить указатель, явно вызвав operator->, что может быть предпочтительнее:

return this->operator->() == rhs.operator->();

Реальный вопрос: «что это такое Odp, почему вы его используете и почему вы не можете его изменить?"


На несвязанной ноте ваш operator== должен быть либо реализован как постоянная функция-член, либо, предпочтительно, как функция друга:

bool operator==(const Ftw& rhs) const { /* ... */ }
friend bool operator==(const Ftw& lhs, const Ftw& rhs) { /* ... */ }

На другой несвязанной ноте перегрузка унарного & почти наверняка плохая идея.

0 голосов
/ 05 августа 2010

Так как Odp раздает указатель бесплатно в своих методах (даже адрес этого, ОМГ! Это все равно, что сделать дверь со множеством замков и затем дать ключи каждому вору вокруг), вы можете просто сделать

bool operator==(const Ftw& rhs)
{
    return **this == *rhs;
}

Если бы Odp реализовал свой собственный оператор сравнения, вы можете использовать его так:

bool operator==(const Ftw& rhs)
{
    return Odp<int>::operator==(rhs) && ... other conditions ...;
}
0 голосов
/ 05 августа 2010

Если вы не можете изменить Odp, вы можете вызвать operator->() явно. Он возвращает то, что вам нужно, и должен быть встроен.

0 голосов
/ 05 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...