Значение из инициализации поля по умолчанию не присваивается - PullRequest
0 голосов
/ 17 мая 2019

В настоящее время я работаю в лаборатории для своего класса операционных систем, и у меня возникают проблемы с пониманием, почему не назначается значение, указанное в инициализации поля по умолчанию для класса.У меня есть следующий класс планировщика:

class LOOK : SSTF {
public:
    io_req* pop() override;
};

, который наследует от этого планировщика:

class SSTF : protected IOSched {
public:
    virtual io_req* pop() override;
    virtual void push(io_req* new_req) override;
protected:
    io_req* left_pop();
    io_req* right_pop();
    int dir;
    LinkedList left;
    LinkedList right;   
};

Где IOSched - это чистый виртуальный класс с методами pop () и push () иПоле curr_req, и это класс LinkedList:

class LinkedList {
public:
    io_req* pop();
    void push(io_req* new_req);
    void push_in_order(io_req* new_req);
    io_req* top() const;
    void reset_dist(io_req* new_curr);
private:
    void insert_between(io_req_node* new_prev, io_req_node* new_next, io_req_node* new_node);
    io_req_node* head = nullptr;
    io_req_node* tail = nullptr;
};

Из моего понимания C ++, когда я выделяю новый объект LOOK следующим образом:

sched = (IOSched*)(new LOOK());

Я получу указатель на выделенный в куче объект LOOK, который будет содержать объект SSTF, который будет содержать два объекта LinkedList, left и right, которые будут инициализированы с помощью head и tail как nullptr.

Однако по какой-то причине я получаю значение 0x203d1 для left.head, а 0x0 для остальных.Это происходит только тогда, когда sched инициализируется как объект LOOK, а не когда SSTF (для лаборатории мне нужно реализовать несколько разных алгоритмов).

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 17 мая 2019
sched = (IOSched*)(new LOOK());

Вы не можете привести указатель на защищенный базовый класс вне класса:

class A{};

class B : protected A {
    void foo(){
        B b;
        A * a = &b; // this is ok
    }
};

int main() {
    A * a = new B; // this is not
}

Вместо этого используйте публичное наследование - это почти всегда то, что вы хотите в традиционной объектно-ориентированной ситуации.

Кроме того, не используйте приведение в стиле c в c ++.Если бы вы использовали static_cast, он бы продолжал кричать на вас, поскольку вы заслуживали, чтобы на вас кричали:)

0 голосов
/ 17 мая 2019

Инициализация нестатического члена является расширением C ++ 11 (см. здесь ).

Поскольку ваши члены не статичны, вы должны инициализировать их в списке инициализации конструктора:

class LinkedList {
public:
    LinkedList() : head(nullptr), tail(nullptr) {}
    io_req* pop();
    void push(io_req* new_req);
    void push_in_order(io_req* new_req);
    io_req* top() const;
    void reset_dist(io_req* new_curr);
private:
    void insert_between(io_req_node* new_prev, io_req_node* new_next, io_req_node* new_node);
    io_req_node* head ; // useless = nullptr;
    io_req_node* tail , // useless = nullptr;
};

Или переключитесь на C ++ 11 или выше.

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