Ваш 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
цветное яблоко.