использование enum в конструкторе c ++ - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь создать класс «Apple», который имеет два значения: 1. int n 2. enum color

, но мой код не работает, и я получаю сообщение об ошибке «Нет подходящего конструктора для инициализации»

Я не знаю, как лучше это сделать.

#include <iostream>
#include<stdexcept>

using namespace std;

class Color{
public:
   enum color{r,g};
};

class Apple: public Color {
    int n;
    Color c;
public:
    Apple(int n,Color color){
        if(n<0)throw runtime_error("");
        this->n=n;
        this->c=color;
    }
    int n_return(){return n;}
};
int main(){
    try{
        const Apple a1{10,Color::g};
        cout << a1.n_return();}
    catch(runtime_error&){
        cout<<"ER\n";
    }
    return 0;
}

Я не хочу ничего менять в main.

Кроме того, как мне это сделать?установить по умолчанию цвет яблока на g в конструкторе, если цвет не указан?

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Ваш Color c; член в class Apple ссылается на базовый класс Color вместо перечисленного в нем перечислителя color.Сказав это, с точки зрения дизайна, вы, похоже, наследуете Apple от цвета .Я считаю, что вы хотели, чтобы каждый экземпляр Apple содержал значение цвета.Для этого вам нужна композиция , а не наследование - так как яблоко не является цветом , оно is-a fruit :), который имеет цвет.

Далее, n_return() должен быть const метод длячтобы вы могли вызывать его из экземпляра const.

Это как можно ближе к вашему исходному коду, который отвечает требованиям, касающимся синтаксиса и дизайна, так что вы можете легко изолировать различия.main() остается прежним:

#include <iostream>
#include<stdexcept>

using namespace std;

enum class Color{r,g};

class Apple{
    int n;
    Color c;
public:
    Apple(int n,Color color){
        if(n<0)throw runtime_error("");
        this->n=n;
        this->c=color;
    }
    int n_return() const {return n;}
};
int main(){
    try{
        const Apple a1{10,Color::g};
        cout << a1.n_return();}
    catch(runtime_error&){
        cout<<"ER\n";
    }
    return 0;
}

Примечание. Я изменил ваш enum на enum class.Общие причины, по которым вы можете прочитать здесь .

Если вы хотите установить значение по умолчанию Color для вашего Apple при строительстве, если это не так.не указывается, тогда вы можете написать декларацию для него следующим образом:

// Apple has Color `g` by default
Apple(int n,Color color = Color::g){//...

Таким образом, вы можете сделать это:

const Apple a1{10};

и получить ваше Color::g цветное яблоко.

0 голосов
/ 24 сентября 2018

Как уже отмечалось в комментариях, вы создаете (пустой) класс Color и определяете в нем перечисление с областью видимости.Все это ненужная затея;все, что вам нужно, это перечисление.Замените ваш класс Color на

enum class Color{r,g};

и не делайте : public Color в объявлении Apple.

Не связано, но необходимо, чтобы ваш код работал так, как написано: Выобъявите вашу Apple переменную как const, но затем вызовите для нее не const метод.Для того чтобы эта работа работала, вам нужно, чтобы ваш n_return выглядел следующим образом.

int n_return() const {return n;}

Обратите внимание на ключевое слово const, чтобы метод можно было использовать для переменных const.

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