Я получаю следующую ошибку в Xcode: относительно моей переменной «in_code» и моего класса «Game_Object»
Переопределение ‘in_code’ с типом разницы ‘Game_Object’ vs ‘char’
Вот мой конструктор для Person, другой класс
Person::Person(char in_code)
{
Game_Object(in_code); -> HERE IS WHERE I AM GETTING THE ERROR!!
speed = 5;
cout << "Person constructed"<<endl;
}
Однако мой конструктор для объекта Game объявлен для получения переменных типа char. Видеть, что:
Game_Object::Game_Object(char in_code)
{
display_code = in_code;
state = 's';
id_num = 0;
location = Cart_Point();
cout<<"Game_Object constructed."<<endl;
Можете ли вы помочь, пожалуйста?
При условии, что Game_Object
это базовый класс Person
, вы должны написать конструктор так:
Person::Person(char in_code):Game_Object(in_code)
{
speed = 5;
cout << "Person constructed"<<endl;
}
У меня тоже была эта ошибка. Я понял.
Но сначала я должен написать некоторую теорию для более легкого понимания.
В C ++ есть две функции, которые неявно создают дополнительный код во время компиляции:
1) конструктор копирования и оператор назначения копирования создаются компилятором, если вы не указали их для своего класса. В части реализации он копирует каждый член рекурсивно.
2) если у вас есть конструктор с одним параметром любого типа, то компилятор также создает оператор присваивания с тем же параметром. В части реализации он создает новый экземпляр вашего типа и присваивает ему вашу переменную.
Это показано в примере кода ниже:
class GameObject{
public:
GameObject(int iD):innerData(iD){
//..
}
int innerData;
};
// Create a new object using constuctor specified by me..
GameObject gameObject(5);
std::cout<<"gameObject = "<<gameObject.innerData<<std::endl;
// Create the second object with different data..
GameObject gameObject2(6);
std::cout<<"gameObject2 = "<<gameObject2.innerData<<std::endl;
// Next line compiles well cause compiler created
// GameObject& operator=(const GameObject&) for us.
gameObject2=gameObject;
std::cout<<"gameObject2 = "<<gameObject2.innerData<<std::endl;
// Next line also compiles well cause compiler created
// GameObject& operator=(int iD) using GameObject(int iD)
// as a reference.
gameObject2=3;
std::cout<<"gameObject2 = "<<gameObject2.innerData<<std::endl;
Конечно, вы можете указать свои собственные конструкторы копирования и операторы копирования или использовать ключевое слово delete (представленное в C ++ 11), чтобы удалить возможность копирования любого экземпляра вашего класса.
Подробнее об «удалении» в C ++ 11 вы можете найти Вот.
Так что в вашем случае компилятор не может решить, какой конструктор вы на самом деле вызываете
Game_Object(in_code);
В строке есть две опции: либо вы вызываете конструктор Game_Object (char), либо вы вызываете конструктор Game_Object (Game_Object (char)). Это может звучать глупо, но эти конструкции отличаются для компилятора.
Таким образом, все, что вам нужно, чтобы решить вашу проблему, это явно указать тип вашего параметра с помощью оператора typecast
Person::Person(char in_code)
{
Game_Object(char(in_code));
speed = 5;
cout << "Person constructed"<<endl;
}
Удачи с C ++ и простите за уродливое форматирование.