c++ - 无法制作指向自定义类型的指针列表

标签 c++ list pointers vector sfml

<分区>

所以,我一直在尝试制作一个指针列表,指向我在我的项目 (GameObject) 中拥有的一个类。我尝试使用 GameObject**、list 和 vector 来做到这一点。但是,其中每一个都会产生很多错误。以下是相关文件:

Globals.h:
#pragma once

#include <iostream>
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <SFML/System.hpp>
#include "GameObject.h"
#include <vector>

#define TITLE "Belty McBelth"
#define WIDTH 1280
#define HEIGHT 720

extern sf::RenderWindow window;
extern sf::Font font;
extern sf::Event ev;
extern sf::Texture playerTex;
extern sf::Sprite playerSprite;
extern sf::Texture tieTex;
extern sf::Sprite tieSprite;
extern std::vector<GameObject *> ObjectList;

extern sf::Clock deltaClock; //A clock that measures the deltaTime(time 
since last frame) in seconds
extern float deltaTime; //Time since last frame in seconds

int setup();
void CleanUp();
void Exit();
void CenterOrigin(sf::Sprite & t);

GlobalDefinitions.cpp:
#include <SFML/Graphics.hpp>
#include <SFML/System.hpp>
#include <SFML/Window.hpp>
#include "GameObject.h"
#include <vector>

std::vector<GameObject*> ObjectList;
sf::RenderWindow window;
sf::Font font;
sf::Event ev;
sf::Texture playerTex;
sf::Sprite playerSprite;
sf::Texture tieTex;
sf::Sprite tieSprite;
sf::Clock deltaClock; //A clock that measures the deltaTime(time since last 
frame) in seconds
float deltaTime; //Time since last frame in seconds

Globals.cpp:
#include "Globals.h"

int setup()
{
    window.create(sf::VideoMode(WIDTH, HEIGHT), "Belty McBelth", 
sf::Style::None);
    if (!font.loadFromFile("../comic.ttf"))return 1;
    if (!playerTex.loadFromFile("../PLAYER.png"))return 1;
    playerSprite = sf::Sprite(playerTex);
    std::cout << "Setup completed without errors \n";
    return 0;
}

void CenterOrigin(sf::Sprite & t)
{
    sf::FloatRect d = t.getLocalBounds();
    t.setOrigin(d.width / 2, d.height / 2);
}

void CleanUp()
{
    for (GameObject* g : ObjectList)delete g;
}

void Exit()
{
    CleanUp();
    window.close();
}

GameObject.h:
#pragma once
#include "Globals.h"

enum ID
{
    player, tie, powerup
};

class GameObject
{
    const char * name;
    const ID id;
    sf::Sprite sprite;
    sf::Vector2f position;

  public:
    GameObject(const char* n, ID i, sf::Sprite spr, sf::Vector2f pos) 
  :name(n), id(i), sprite(spr), position(pos) {}
    virtual void Update();
    virtual void Draw() const;
    virtual void Draw(sf::Shader&)const;
    const char* getName() const;
    const ID getID() const;
    sf::Vector2f getPosition() const;

    void ChangeTexture(sf::Texture&);
    void SetPosition(const sf::Vector2f);
    void Move(float, float);
    void Move(const sf::Vector2f);

    template<typename T> static GameObject* Instantiate(const char* n, ID i, 
sf::Sprite spr, sf::Vector2f pos);
};

template<typename T>
inline GameObject * GameObject::Instantiate(const char* n, ID i, sf::Sprite 
spr, sf::Vector2f pos)
{
    GameObject* obj = new T();
    obj->name = n;
    obj->id = i;
    obj->sprite = spr;
    obj->position = pos;
    ObjectList.push_back(obj);
    return obj;
}

GameObject.cpp:
#include "GameObject.h"

void GameObject::Update()
{
    sprite.setPosition(position);
    Draw();
}

void GameObject::Draw() const
{
    window.draw(sprite);
}

void GameObject::Draw(sf::Shader& s) const
{
    window.draw(sprite, &s);
}

const char * GameObject::getName() const
{
    return name;
}

const ID GameObject::getID() const
{
    return id;
}

sf::Vector2f GameObject::getPosition() const
{
    return position;
}

void GameObject::ChangeTexture(sf::Texture & t)
{
    sprite.setTexture(t);
}

void GameObject::SetPosition(const sf::Vector2f p)
{
    position = p;
}

void GameObject::Move(float xOff, float yOff)
{
    position.x += xOff;
    position.y += yOff;
}

void GameObject::Move(sf::Vector2f v)
{
    position += v;
}

预构建时,Visual Studio 无法识别任何错误,但是当我尝试构建项目时,我遇到了很多构建错误。阅读这些错误的 Microsoft 页面后,我无法找到这些错误发生的原因。

Build Error Window

最佳答案

我认为您在 Globals.hGameObject.h 之间存在循环包含依赖关系。我建议您只在 Globals.h 中转发声明 GameObject 而不要包含 GameObject.h。您可以这样做,因为您只使用 GameObject 作为指针。 在这里查看更多 circular dependency

全局变量

//#include "GameObject.h"
externs...
class GameObject;
std::vector<GameObject*> ObjectList;

游戏对象.h

#include "Globals.h"
class GameObject{...};

关于c++ - 无法制作指向自定义类型的指针列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54901189/

相关文章:

c++ - 如何使用 visual studio 调试 Borland BCC55 编译的 EXE?

c++ - 为什么我们要在读取输入后调用 cin.clear() 和 cin.ignore()?

python插入函数列表理解

c - 在 C 中使用指针打印字符串

c - 使用指针初始化结构体的成员 (C)

c++ - VS 2008 和 VS 2017 中静态数组的不同行为

c# - 为什么调用我的 List<Point>.Clear() 会抛出 ArgumentOutOfRangeException?

c++ - 从 std::list 中清除元素的顺序是什么?

c - 指向结构 C 指针的指针

c++ - 高性能计算的C++类