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;

Можете ли вы помочь, пожалуйста?

0

Решение

При условии, что Game_Object это базовый класс Person, вы должны написать конструктор так:

Person::Person(char in_code):Game_Object(in_code)
{

speed = 5;

cout << "Person constructed"<<endl;

}
0

Другие решения

У меня тоже была эта ошибка. Я понял.
Но сначала я должен написать некоторую теорию для более легкого понимания.
В 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 ++ и простите за уродливое форматирование.

0

По вопросам рекламы [email protected]