Проблема в том, что tick()
нужно знать определение tile_tree_apple
, но все, что у него есть, это предварительное объявление. Вы должны разделить объявления и определения следующим образом:
tile_tree.h
#ifndef TILE_TREE_H
#define TILE_TREE_H
#include "tile.h"
class tile_tree : public tile
{
public:
tile onDestroy();
tile tick();
void onCreate();
};
#endif
tile_tree.cpp
:
tile tile_tree::onDestroy() {
return *new tile_grass;
}
tile tile_tree::tick() {
if (rand() % 20 == 0)
return *new tile_tree_apple;
}
void tile_tree::onCreate() {
health = rand() % 5 + 4;
type = TILET_TREE;
}
Кроме у вас есть серьезная проблема: вы выделяете память (с помощью new
), затем копируете выделенный объект и возвращаете копию. Это называется утечка памяти , потому что у вашей программы нет возможности освободить память, которую она использует. Кроме того, вы копируете tile_tree
в tile
, который отбрасывает информацию, которая отличает tile_tree
от tile
; это называется нарезка .
То, что вы хотите, это вернуть указатель на новый tile
и убедиться, что в какой-то момент вы вызываете delete
для освобождения памяти:
tile* tile_tree::tick() {
if (rand() % 20 == 0)
return new tile_tree_apple;
}
Еще лучше было бы вернуть умный указатель, который будет обрабатывать управление памятью для вас:
#include <memory>
std::shared_ptr<tile> tile_tree::tick() {
if (rand() % 20 == 0)
return std::make_shared<tile_tree_apple>();
}