2013-11-16 4 views
0

я получаю следующее сообщение об ошибке на Xcode: Что касается моего переменного «in_code» и моего класса «Game_Object»Redifiniton переменного с другим типом

переопределения «in_code» с разностным типом «Game_Object» против «полукокса '

Вот мой конструктор для лица, другого класс

Person::Person(char in_code) 
{ 
Game_Object(in_code);  -> HERE IS WHERE I AM GETTING THE ERROR!! 

speed = 5; 

cout << "Person constructed"<<endl; 

} 

Однако мой конструктор объекта игры объявляется получить полукокс переменных. См. Это:

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 obj (in_code);' – gongzhitaao

+1

. Будем ли мы начинать с предположения, что 'Game_Object' является базовым классом' Person', и вы случайно положили его в тело конструктора 'Person', а не в список инициализации. ? Несвязанный: 'location = Cart_Point();' бесполезно, если член объявлен 'Cart_Point location'' в классе def. Он уже построен с таким дефолтом. На самом деле, я не вижу причины * всех * других назначений в этом конструкторе, которые не находятся в списке инициализации 'Game_Object', причем только' cout << ...' находится в фактическом теле. – WhozCraig

ответ

0

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

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

speed = 5; 

cout << "Person constructed"<<endl; 

} 
+0

+1 И если это * не * базовый класс, 'Game_Object (in_code);' сама строка бесполезна и должна быть удалена. – WhozCraig

+0

Большое спасибо! – user2998261

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; 

Конечно вы можете указать свои собственные конструкторы копий и операторы присваивания или использовать «удалить» (представленный в C++ 11) ключевое слово, чтобы удалите возможность справиться с любым экземпляром вашего класса. Подробнее о 'delete' в C++ 11 вы найдете here.

Так что в вашем случае компилятор не может решить, что конструктор вы на самом деле назвать в

Game_Object(in_code); 

линии причины есть два варианта: либо вы называете Game_Object (символов) конструктор или вызове Game_Object (Game_Object (Char)) конструктор , Это может показаться глупым, но эти конструкции для компилятора отличаются.

Так все, что вам нужно решить ваш вопрос явно указать тип вашего параметра с оператором приведения типа

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

speed = 5; 

cout << "Person constructed"<<endl; 

} 

Удачи с C++ и извините за уродливое форматирование.