Использование объекта внутри класса и использование методов объекта другого класса не работает - PullRequest
0 голосов
/ 16 февраля 2020

Я пытаюсь создать объект часов, просто создав объект с именем "boundedCounter", у которого есть значение и предел, значение начинается с 0 и продолжается до тех пор, пока не достигнет предела, затем он сбрасывается до 0 и продолжает считать. Я хочу, чтобы объект часов использовал 3 ограниченных счетчика для каждой секунды, минуты и часы, а все остальное просто. Когда я делал это в java, это работало довольно хорошо. Но теперь, изучив C ++, я не могу понять, почему создание объекта boundedCounter внутри класса часов не работает. Я попытался сделать его унаследованным классом, создать методы и тому подобное. Вот код:

class boundedCounter {
private:
    int value, limit;

public:

    boundedCounter(int boundLimit) {
        value = 0;
        limit = boundLimit;
    }

    void next() {
        if (++value == limit) {
            value = 0;
        }
    }

    void setLimit(int boundLimit) {
        limit = boundLimit;
    }

    int getValue() {
        return value;
    }
};

class Clock : private boundedCounter {
public:
    boundedCounter seconds(60);
    boundedCounter minutes(60);
    boundedCounter hours(24);

    seconds.setLimit(60);
};

Ошибки:

E0079 expected a type specifier line 35
E0079 expected a type specifier line 36
E0079 expected a type specifier line 37
E0077 this declaration has no storage class or type specifier line 39
E0065 expected a ';'

Ответы [ 2 ]

0 голосов
/ 16 февраля 2020

Компилятор ожидал, что в этом случае вы объявите объекты boundedCounter в классе Clock, следуя приведенному ниже синтаксису:

boundedCounter seconds = 60;
boundedCounter minutes =60;
boundedCounter hours = 24;

Строка 'seconds.setLimit (60)' не будет работать, потому что это попытка для выполнения функции-члена секунд при объявлении класса.

Кроме того, когда вы объявляете 'класс Clock: private boundedCounter', вы создаете расширенный bounderCounter с именем Clock, с частными членами функции next, setLimit и getValue. Я уверен, что это не то, что вы хотите от класса Часы.

Ниже вы можете проверить свой код:

class boundedCounter {
private:
    int value = 0;
    int limit;

public:
    boundedCounter(int boundLimit) : limit(boundLimit) {}

    void next() {
        if (++value == limit)
            value = 0;
    }
    void setLimit(int boundLimit) { limit = boundLimit; }
    int getValue() { return value; }
};

struct Clock {
    boundedCounter seconds = 60;
    boundedCounter minutes = 60;
    boundedCounter hours = 24;
};
0 голосов
/ 16 февраля 2020

В этом коде есть несколько проблем; Прежде всего, нет необходимости присущи другому классу! Наследование определяется как отношение «является». Часы не являются ограниченным счетчиком, они имеют 3 различных счетчика - секунды, минуты, часы (таким образом, у нас есть отношение «имеет»). Поэтому вы должны изменить отношение к композиции. Практическое правило - вы должны предпочесть состав над наследованием .

Во-вторых, вы не можете инициализировать нефиксированные c переменные-члены вот так, это должно быть сделано внутри нестати c функции (и, скорее всего, в ctor класса). Обратите внимание, что я поместил его в список инициализаторов, а не в тело ctor, что является лучшей практикой.

Следующий код правильно компилируется:

class boundedCounter {
private:
    int value, limit;

public:

    boundedCounter(int boundLimit) {
        value = 0;
        limit = boundLimit;
    }

    void next() {
        if (++value == limit) {
            value = 0;
        }
    }

    void setLimit(int boundLimit) {
        limit = boundLimit;
    }

    int getValue() {
        return value;
    }
};

class Clock {
public:
    boundedCounter seconds;
    boundedCounter minutes;
    boundedCounter hours;

    Clock() :
    seconds(60),
    minutes(60),
    hours(24)
    {
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...