Member 12914219 Ответов: 2

Почему мои частные переменные недоступны для функции члена


void dooperation()
   {
       cout<<x+y;

   }

несмотря на то, что x ,y теперь являются частными членами класса сложения ...почему они выходят за рамки членского сотрудничества();

Что я уже пробовал:

#include <iostream>

using namespace std;
template<class T>
class calculator
{
    protected:
    T x;
    T y;
    public:
        calculator(T m,T n)
        {
            x=m;
            y=n;

        }
    virtual void dooperation()=0;
    

};

template<class T>
class addition: public calculator<T>
{
public:
    addition(T m,T n):calculator<T>(m,n)
    {

    }
    void dooperation()
    {
        cout<<x+y;
       
    }



};

int main()
{
    addition<int> add(3,4);
    calculator <int>* ptr;
    ptr=&add;
    ptr->dooperation();
}

[no name]

Цитата: "почему они выходят за рамки членского сотрудничества()"
Какие у вас есть доказательства этого?

2 Ответов

Рейтинг:
2

KarstenK

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

public:
const T& getX() { return x; }


Рейтинг:
16

Jochen Arndt

Это связано не с частными членами здесь (у вас их нет в вашем коде), а с тем фактом, что имена не зависят друг от друга.

Это подробно объясняется на сайте Стандартный C++ FAQ: почему я получаю ошибки, когда мой шаблон-производный-класс использует член, который он наследует от своего шаблона-базового-класса?[^] и обеспечивает решение этой проблемы:

void dooperation()
{
    cout << this->x + this->y;
}


[no name]

Хорошо. Спрашивающий не указывает, какой компилятор. Мой VC++ 2017 прекрасно справляется с этим (никаких предупреждений - правильный вывод), хотя и появляется нестандартным образом. Молчаливый неправильный потенциал компиляции, безусловно, представляет опасность.

Jochen Arndt

Как сказано по ссылке (и в других местах при поиске темы):
"Возможно, удивительно, что следующий код не является допустимым C++, хотя некоторые компиляторы принимают его"

Он, вероятно, использует компилятор GNU, потому что это выдает сообщение об ошибке о "членах вне области действия".

CPallini

5.