Другие языки программирования и технологии
C++ Классы и Переменные
Собственно пишу игру. Планируется много типов юнитов. Которые отличаться будут некоторыми свойствами и функциями. Я так понимаю надо создать базовый класс Unit от которого наследовать Unit1 Unit2 и тд. и переопределять то что необходимо. Но в таком случае как динамически сделать переменную x нужного класса? Пример: if (a
class Unit
{
public:
Unit ();
virtual ~Unit ();
virtual void Method() { printf("Unit::Method()\n"); }
};
class Unit1 : public Unit
{
public:
Unit1();
virtual ~Unit1();
virtual void Method() { printf("Unit1::Method()\n"); }
};
class Unit2 : public Unit
{
public:
Unit2();
virtual ~Unit2();
virtual void Method() { printf("Unit2::Method()\n"); }
};
int main()
{
Unit *pUnit = NULL;
if (a < b)
{
pUnit = new Unit1;
}
else
{
pUnit = new Unit2;
}
pUnit->Method();
delete pUnit;
return 0;
}
Поскольку указатели на производные классы приводятся к указателям на базовый класс, то Method() дожен быть объявлен как виртуальный, как в базовом классе, так и в производных классах. В этом случае будут работать методы призводных классов. В противном случае везде будет работать метод базового класса. Можешь проверить: в методах напиши какое нибудь сообщение, метод какого класса вызвался.
if ( a < b )
{
Unit1 x;
}
else
{
Unit2 x;
}
x сущестует только внутри if( ){ x - только здесь } здесь уже нет
{
public:
Unit ();
virtual ~Unit ();
virtual void Method() { printf("Unit::Method()\n"); }
};
class Unit1 : public Unit
{
public:
Unit1();
virtual ~Unit1();
virtual void Method() { printf("Unit1::Method()\n"); }
};
class Unit2 : public Unit
{
public:
Unit2();
virtual ~Unit2();
virtual void Method() { printf("Unit2::Method()\n"); }
};
int main()
{
Unit *pUnit = NULL;
if (a < b)
{
pUnit = new Unit1;
}
else
{
pUnit = new Unit2;
}
pUnit->Method();
delete pUnit;
return 0;
}
Поскольку указатели на производные классы приводятся к указателям на базовый класс, то Method() дожен быть объявлен как виртуальный, как в базовом классе, так и в производных классах. В этом случае будут работать методы призводных классов. В противном случае везде будет работать метод базового класса. Можешь проверить: в методах напиши какое нибудь сообщение, метод какого класса вызвался.
if ( a < b )
{
Unit1 x;
}
else
{
Unit2 x;
}
x сущестует только внутри if( ){ x - только здесь } здесь уже нет
Помоему так делать просто нельзя. А что компилятор то говорит??
// скобки забыл
if ( a < b ) {
Unit1 x;
}else{
Unit2 x;
}
if ( a < b ) {
Unit1 x;
}else{
Unit2 x;
}
Если наследуешься то по идеи:
Unit* x;
if (a < b)
x = new Unit1();
else
x = new Unit2();
Вообще по идеи Unit должен быть интерфейсом, а Unit1 и Unit2 реализацией. С++ давно не занимался, мог ошибиться с кодом.
Unit* x;
if (a < b)
x = new Unit1();
else
x = new Unit2();
Вообще по идеи Unit должен быть интерфейсом, а Unit1 и Unit2 реализацией. С++ давно не занимался, мог ошибиться с кодом.
На сколько я помню не правильно обьявляешь экземпляры класса.
Нужно так:
Unit *x;
if ( a < b )
{
x = new Unit1(<сюда параметры для конструктора>);
}else{
x = new Unit2(<сюда параметры для конструктора>);
}
Нужно так:
Unit *x;
if ( a < b )
{
x = new Unit1(<сюда параметры для конструктора>);
}else{
x = new Unit2(<сюда параметры для конструктора>);
}
Похожие вопросы
- Есть ли ошибка? Может ли возникнуть? И вообще приемлимо ли? C++ классы
- C++ Классы
- C++ классы и структуры
- C++. Классы.
- С++, объект класса, экземпляр класса, какой тип переменной хранит экземпляр класса? (экземпляр это что? Word, lpstr..?)
- Как преобразовать строки файла в переменные (C#)?
- Как в C++ приравнять переменную и текст? А то такую запись нельзя. А без этого задачу не решить
- C#. Как сделать, чтобы программа проверяла тип введённой переменной?
- [C++] Почему не рекомендуют использовать глобальные переменные?
- [C/C++] Oбъявление переменной типа структуры в этой же структуре