Конструктор, принимающий базу и не называется - PullRequest
0 голосов
/ 29 октября 2018

Я работаю над простой программой для булевой алгебры, но двойное отрицание не работает должным образом.

У меня есть следующие классы:

Оператор:

#ifndef OPERATOR_H
#define OPERATOR_H

class Operator {
public:
    virtual int getArity(void) const = 0;
    virtual bool calc(void) const = 0;
};

#endif // OPERATOR_H

Ложная:

#ifndef FALSE_H
#define FALSE_H

#include "operator.h"

class False : public Operator {
public:
    int getArity() const {
        return 0;
    }

    bool calc(void) const {
        return false;
    }
};

#endif // FALSE_H

Не:

#ifndef NOT_H
#define NOT_H

#include "operator.h"

class Not : public Operator {
public:
    Not(Operator& child) : m_child(child) {
        std::cout << "not constructor called" << std::endl;
    }

    int getArity(void) const {
        return 1;
    }

    bool calc(void) const {
        return !m_child.calc();
    }

private:
    Operator& m_child;
};

#endif // NOT_H

Мой main.cpp:

#include <iostream>
#include "operator.h"
#include "not.h"
#include "false.h"

using namespace std;

int main(int argc, char *argv[]) {

    False f;
    Not n = Not(f);
    Not d = Not(n);

    cout << "n.calc(): " << n.calc() <<endl;
    cout << "d.calc(): " << d.calc() <<endl;
    return 0;
}

Поскольку d = Not (Not (False ())), я ожидаю, что оно будет ложным.

Вывод:

not constructor called
n.calc(): 1
d.calc(): 1 <== should be 0

Почему конструктор класса Not не вызывается с объектом типа Not как дочерний?

1 Ответ

0 голосов
/ 29 октября 2018

Not d = Not(n); вызывает конструктор копирования Not, поскольку аргумент также имеет тип Not. Подпись конструктора копирования лучше совпадает, и поэтому она выбрана.

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