Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法创建指向自定义类型的指针列表_C++_List_Pointers_Vector_Sfml - Fatal编程技术网

C++ 无法创建指向自定义类型的指针列表

C++ 无法创建指向自定义类型的指针列表,c++,list,pointers,vector,sfml,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&

所以,我一直在尝试制作一个指向我的项目中的类(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;
}
Globals.h:
#布拉格语一次
#包括
#包括
#包括
#包括
#包括“GameObject.h”
#包括
#定义标题“Belty McBelth”
#定义宽度1280
#定义高度720
外部sf::RenderWindow窗口;
外部sf::字体;
外部sf::事件ev;
外部sf::纹理playerTex;
外部sf::精灵玩家斯普林特;
外部sf::纹理tieTex;
外部sf::雪碧铁斯普里特;
向量对象列表;
外部sf::时钟延迟锁//测量deltaTime(时间)的时钟
从上一帧开始)秒
外浮三角洲//自上一帧起的时间(秒)
int setup();
空洞清理();
无效退出();
空心中心原点(sf::Sprite&t);
GlobalDefinitions.cpp:
#包括
#包括
#包括
#包括“GameObject.h”
#包括
向量对象列表;
sf::RenderWindow窗口;
sf::字体;
sf::事件ev;
sf::纹理playerTex;
雪碧玩家斯普林特;
sf::纹理tieTex;
sf::雪碧铁普里特;
sf:时钟延迟锁//测量deltaTime(从上次开始的时间)的时钟
帧)以秒为单位
浮三角洲//自上一帧起的时间(秒)
Globals.cpp:
#包括“Globals.h”
int setup()
{
创建(sf::VideoMode(宽度、高度),“Belty McBelth”,
sf::Style::None);
如果(!font.loadFromFile(“../comic.ttf”))返回1;
如果(!playerTex.loadFromFile(“../PLAYER.png”))返回1;
playerSprite=sf::Sprite(playerTex);
std::cout name=n;
obj->id=i;
obj->sprite=spr;
obj->位置=位置;
ObjectList.push_back(obj);
返回obj;
}
GameObject.cpp:
#包括“GameObject.h”
void GameObject::Update()
{
设置位置(位置);
Draw();
}
void GameObject::Draw()常量
{
窗口。绘制(精灵);
}
void GameObject::Draw(sf::Shader&s)const
{
窗口绘制(精灵和s);
}
常量char*GameObject::getName()常量
{
返回名称;
}
常量ID游戏对象::getID()常量
{
返回id;
}
sf::Vector2f游戏对象::getPosition()常量
{
返回位置;
}
void GameObject::ChangeTexture(sf::Texture&t)
{
雪碧(t);
}
void GameObject::SetPosition(const sf::Vector2f p)
{
位置=p;
}
void GameObject::Move(float xOff,float yOff)
{
位置x+=xOff;
位置y+=yOff;
}
void GameObject::Move(sf::Vector2f v)
{
位置+=v;
}
预构建时,VisualStudio不会识别任何错误,但是当我尝试构建项目时,会遇到很多构建错误。在阅读了这些错误的microsoft页面后,我无法找到这些错误发生的原因


我认为在
Globals.h
GameObject.h
之间有一个循环include依赖关系。我建议您只在
Globals.h
中转发声明
GameObject
,而不包括
GameObject.h
。您可以这样做,因为您只使用
GameObject
作为指针。 在这里看到更多

Globals.h

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

如果您粘贴代码,通常最好粘贴一个最小的工作示例,以便试图提供帮助的人可以将注意力集中在相关的位上,从而导致堆栈溢出。请阅读,采取,阅读,以及。最后,请学习如何创建一个显示给我们。欢迎使用堆栈溢出!请使用您的代码将其简化为您的问题的一部分。您当前的代码包含了许多与您的问题无关的内容—一个最小的样本通常看起来类似于一个好的单元测试:只执行一个任务,输入值指定用于再现性。是的,这很有效
#include "Globals.h"
class GameObject{...};