ошибка в C ++, в контексте - PullRequest
0 голосов
/ 16 июня 2010

Я получил домашнее задание по созданию программы без приведения с использованием конструкторов, так что это мой код, у меня есть два класса:

class Base {
protected:
    int var;
public:
    Base(int var = 0);
    Base(const Base&);
    Base& operator=(const Base&);
    virtual ~Base(){};
    virtual void foo();
    void foo() const;
    operator int();
};

class Derived: public Base {
public:
    Derived(int var): Base(var){};
    Derived(const Base&);
    Derived&  Derived::operator=(const Base& base);
    ~Derived(){};
    virtual void foo();
};

вот две мои функции из Derived:

Derived::Derived(const Base& base){
    if (this != &base){
        var=base.var;
    }
}

Derived&  Derived::operator=(const Base& base){
    if (this != &base){
        var=base.var;
    }
    return *this;
}

но у меня появляется ошибка within context, когда я вызываю эти строки

Base base(5);
Base *pderived = new Derived(base);  //this row works perfectly
Derived derived = *pderived;  // I think the problem is here

спасибо за любую помощь

Ответы [ 3 ]

0 голосов
/ 16 июня 2010

Вы можете получить доступ к защищенным элементам из другого объекта, только если этот объект того же типа, что и объект, который пытается получить к нему доступ. В вашем примере и конструктор, и оператор присваивания принимают значение const Base&, поэтому нет гарантии, что фактический объект будет иметь тип Derived.

0 голосов
/ 16 июня 2010

Derived необходимо делегировать копирование Base членов Base::operator=, вместо того, чтобы пытаться своими грязными маленькими руками защищать члены другого объекта.

0 голосов
/ 16 июня 2010

Ошибка (VS2010)

error C2248: 'Base::var' : cannot access protected member declared in class 'Base'

на линии

var=base.var;

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