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;

}
Другие вопросы по тегам