Мой сеттер не работает в новом классе (наследование) - PullRequest
0 голосов
/ 15 мая 2019

Это мой код. Я создал базовый класс и в конструкторе установил x = 0. Далее я использовал virtual set_x() = 0. И я создал set_x () в новом классе. Выход:

set x 100 DONE. Let's check. 0500

Почему я получил 0500, а не 100500?

#include "mainwindow.h"
#include <QApplication>
#include <fstream>
#include <string>
#include <iostream>

using namespace std;

struct invalid_file_handler : std::runtime_error{
    using runtime_error::runtime_error;
};
class base_class{
private:
    int x;
    int y;
public:
    virtual void set_x()=0;
    void set_y(){
        this->y=500;
    }
    int get_x(){
        return (this->x);
    }
    int get_y(){
        return (this->y);
    }
    base_class(){
      this->x=0;
      this->y=0;
    }
};

class new_class :public base_class{
public:
    void set_x();
private:
    int z;
    int x;
    int y;
};

void new_class::set_x(){
    cout << "set x " << endl;
    this->x=100;
    cout << this->x << endl << "DONE. Let's check.  ";
}

int main()
{

    ifstream my_open_file;
    string file_path = "/home/wojtek/Pulpit/elo.odt";
    try{
        my_open_file.open("/home/wojtek/Pulpit/elo.odt");
        my_open_file.close();
    }catch (std::runtime_error &e){
        cerr << "Hello Xd XD chua" << endl;
        cerr << e.what();
    }
    ofstream myfile;
    try{
    myfile.open ("/home/wojtek/Pulpit/example.txt");
    myfile << "Writing this to a file.\n";
    myfile.close();
    }
    catch(invalid_file_handler &e){
        cerr << "Hello!" << endl;
    }
    new_class *object = new new_class();
    object->set_x();
    cout << object->get_x();
    object->set_y();
    cout << object->get_y();
    //base_class object;
    //cout << object.get_y();

    return 0;
}

1 Ответ

1 голос
/ 15 мая 2019

Переменные x и y, объявленные в new_class, представляют собой shadowing переменные с такими же именами, объявленными в base_class.Это означает, что в любом методе члена new_class имя x относится к new_class::x и , а не base_class::x.

Просто удалите эти строки из определения new_class:

int x;
int y;

И сделать те же члены в base_class protected вместо private, чтобы new_class также имел доступ:

class base_class{
protected:
    int x;
    int y;

Примечание: ваш код имеет утечку памяти, так как вы никогда не delete object после его выделения.Всегда delete то, что вы new, и не используйте new, если вам действительно не нужно.

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