@Sergey6661313

Как в с++ добавить переменную в обьект уже определённого класса?

на примере питона (3):
class entity: pass   # обьявляем класс
player = entity()    # новый обьект player
player.dead = True   # ТУТ мы создаём новую переменную для player? не указанную в классе entity
print(player.dead)   # печатаем её (чисто для примера)


Там такой код работает. Вопрос в том как написать такое же только на c++?

#include <stdio.h>                 // библиотека с функии printf
class entity{};                    // обьявляем класс
int main(int argc, char* argv[] ){ // магия :)
	entity player;                   // создаём обьект player
	bool player.dead = true;         // ТУТ должна создаваться переменная, но ни судьба :(
	printf("%s", player.dead ? "true" : "false");// сдесь и далее  - более страшное колдунство чем int main :)
	return 0;
}
  • Вопрос задан
  • 481 просмотр
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Способ 1. Наследование.
class Entity
{
public:
  virtual ~Entity() {}    // для корректной работы динамических структур данных 
                          // наподобие менеджеров уровней; в нашем примере не нужно;
                          // в реальной игре потребуется
}

class Player : public Entity
{
public:
   bool isDead;
}

int main()
{
   Player player;
   player.isDead = true;
   return 0;
}


Если кто-то отдаёт Entity, окторый гарантированно Player — то
Player& somePlayer = dynamic_cast<Player&>(someEntity);


Способ 2. Композиция
class Player
{
public:
   Entity entity;
   bool isDead;
}


Способ 3. Словарь. Это уже на случай, когда чужой код настолько монолитный, что ничем его не прошибёшь.
struct PlayerInfo
{
    bool isDead;
}

std::map<const Entity*, PlayerInfo> playerInfo;


Если чужой код монолитный, а объекты ещё и перемещаются по памяти — тогда выяснить, что будет «значением» объекта (например, какой-нибудь идентификатор).

typedef std::string PlayerId;
std::map<PlayerId, PlayerInfo> playerInfo;


Если и код монолитный, и «имя» или «значение» объекту никак не придумаешь — тогда никак.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@balamyt92
; select * from users; --
Никак. Потому что:
YmE14ybtZbNlxm.jpg
Ответ написан
OnYourLips
@OnYourLips
Никак.

Это особенность питона, и она есть еще в небольшом количестве языков. Например, ruby.
И я отмечу, что эта особенность скорее минус, чем плюс.

Прототипировать с ней быстрее, но на долгосрочной поддержке она отрицательно сказывается.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы