Redifiniton переменной с другим типом
Я получаю следующую ошибку в 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;
Можете ли вы помочь, пожалуйста?
2 ответа
У меня тоже была эта ошибка. Я понял. Но сначала я должен написать некоторую теорию для более легкого понимания. В 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++ и простите за уродливое форматирование.
При условии, что Game_Object
это базовый класс Person
, вы должны написать конструктор так:
Person::Person(char in_code):Game_Object(in_code)
{
speed = 5;
cout << "Person constructed"<<endl;
}