静态对象指针

static Object Pointer

本文关键字:指针 对象 静态      更新时间:2023-10-16

我想在方法内部创建一个静态对象。方法的类有一个类型为Player的指针。Phayer是一个抽象类。现在我想让指针指向一个从Player继承的Object。当Methode关闭时,该引用不应该丢失。指针初始化如下:

pragma once
include "Player.h"
include "Matchfield.h"
class Game
{
public:
Game();
~Game();
void start();
private:
Player *playerone;
Player *playertwo;
Matchfield gamefield;
};

现在我是这样做的:

Game::Game()
{
for (int i = 0; i < 2; i++) {
switch (CLI::getplayer())
{
case 0:
{
static HumanPlayer x;
playerone = &x;
}
case 1:
{
BotOne x;
playerone = &x;
}
default:
break;
}
}
}

然后,另一个方法尝试从指针引用的对象中调用一个方法。

int actMove;
int inheight;
while (true) {
actMove = playerone->play(gamefield);
inheight = gamefield.columnHeight(actMove);
... Bla Bla just boring stuff

我犯了一个错误,不可能找到我的对象,为什么?不是静态的吗?

谢谢你的回答,我很感激!:(

为问题添加极简主义示例:

class Player
{
public:
Player() = default;
~Player() = default;
virtual int play(Matchfield ActField) = 0;
bool ishuman;
};
Game::Game()
{
static HumanPlayer x;
playerone = &x;
}

HumanPlayer不是一个抽象类;现在我想在其他地方使用指针Playerone。例如这里;在Humanplayer中播放将返回一个int;

int Game::play(){
return = playerone->play();
}

要回答有关类中static指针的问题:
头文件:

class Game
{
public:
Game();
~Game();
void start();
private:
static Player *playerone;
static Player *playertwo;
Matchfield gamefield;
};

源文件:

Player * Game::playerone = nullptr;
Player * Game::playertwo = nullptr;
Game::Game()
{ ; }
Game::~Game()
{
delete playerone;
delete playertwo;
}
void Game::start()
{
delete playerone;
delete playertwo;
// Example:
playerone = new Human;
playertwo = new Bot;
}

由于指针是变量,它们遵循与类中的静态变量相同的语法。

static关键字意味着所有Game实例都有一个实例,并且其派生类的实例。它们都共享相同的playeroneplayertwo

编辑1:方法中的静态
方法中的static变量只能在方法中访问。static关键字表示变量将在执行离开函数后存在。因此,下次输入函数时,变量将具有与上次执行函数时相同的值。

void AddOne()
{
static int value = 0;
std::cout << "Previous value: " << value << "n";
++value;
std::cout << "Value after add: " << value << "nn";
}
int main()
{
AddOne();
AddOne();
AddOne();
AddOne();
return 0;
}

上面的代码演示了static变量的生存期。

您可以将指针声明为静态,这样它在退出方法时就不会丢失引用,但无论何时实例化类型为Game的对象,指针都将已填充该值。你可以做:

class Game
{
public:
Game();
~Game();
void start();
private:
static Player *playerone;
static Player *playertwo;
Matchfield gamefield;
};