Все это автоматические переменные.Их время жизни закончится, когда вы достигнете конца текущей области.Нет необходимости удалять их;это произойдет автоматически, как только вы достигнете конца текущей области.
Если вы хотите, чтобы ваш объект класса Game
владел мячом, веслами и доской, им было бы разумноиметь членский охват.т.е.
class Game {
public:
static const int BOARD_WIDTH = 60;
static const int BOARD_HEIGHT = 12;
Game()
: ball{-1, 1, BOARD_WIDTH / 2, BOARD_HEIGHT / 2},
paddle1{4, BOARD_HEIGHT / 2, 3},
paddle2{BOARD_WIDTH - 4, BOARD_HEIGHT / 2, 3}
{}
private:
Ball ball;
Paddle paddle1;
Paddle paddle2;
Board board;
};
Эти объекты-члены будут иметь общее время жизни объекта Game
.
Указатели - это просто объекты, указывающие на другие объекты.Они не влияют на время жизни объекта, на который они указывают.Например, вы можете возвращать указатели на члены объекта из метода.Просто позаботьтесь о том, чтобы ваши указатели не переживали объекты, на которые они указывают.
Если вы хотите, чтобы ваш класс Game
содержал указатели на другие объекты, вам нужно будет управлять временем жизни этих других объектов.сам.Например, вы можете динамически распределить их.Это имеет очень мало преимуществ по сравнению с объектами, содержащимися непосредственно в объекте Game
, и добавляет значительную сложность и накладные расходы.
Здесь я использую std::unique_ptr
для управления памятью:
class Game {
public:
static const int BOARD_WIDTH = 60;
static const int BOARD_HEIGHT = 12;
Game()
: ball{std::make_unique<Ball>(-1, 1, BOARD_WIDTH / 2, BOARD_HEIGHT / 2)},
paddle1{std::make_unique<Paddle>(4, BOARD_HEIGHT / 2, 3)},
paddle2{std::make_unique<Paddle>(BOARD_WIDTH - 4, BOARD_HEIGHT / 2, 3)},
board{std::make_unique<Board>()}
{}
// Copying is implicitly disallowed since std::unique_ptr is non-copyable.
// You could implement a copy constructor and copy assignment operator to
// do a deep copy
private:
std::unique_ptr<Ball> ball;
std::unique_ptr<Paddle> paddle1;
std::unique_ptr<Paddle> paddle2;
std::unique_ptr<Board> board;
};
Или вы можете сделать управление памятью вручную, если вы действительно этого хотите, но это мало что дает:
class Game {
public:
static const int BOARD_WIDTH = 60;
static const int BOARD_HEIGHT = 12;
Game()
: ball{new Ball(-1, 1, BOARD_WIDTH / 2, BOARD_HEIGHT / 2)},
paddle1{new Paddle(4, BOARD_HEIGHT / 2, 3)},
paddle2{new Paddle(BOARD_WIDTH - 4, BOARD_HEIGHT / 2, 3)},
board{new Board()}
{}
// You must implement these yourself to do a deep copy when doing manual
// memory management. I've opted to delete them to disallow copying a Game object
Game(const Game&) = delete;
Game& operator=(const Game&) = delete;
~Game() {
// every instance of 'new' must have exactly one matching 'delete'
delete board;
delete paddle2;
delete paddle1;
delete ball;
}
private:
Ball* ball;
Paddle* paddle1;
Paddle* paddle2;
Board* board;
};