我一直试图制作一些代码,但我对c ++有点新,需要一些帮助。
我无法将类Player
实例化为指针,因为它是“不完整类型”(或未定义类型,vs表示两者)。以下是我的代码的一些(简化的,虽然不是很简陋)版本:
Entity.h
#pragma once
#include <vector>
class Entity
{
public:
static void init();
class EntityObject;
class Player;
static std::vector<EntityObject*> entities;
};
Entity.cpp
#include "Entity.h"
void Entity::init()
{
entities = std::vector<EntityObject*>();
}
class Entity::EntityObject
{
private:
float velX, velY, x, y;
public:
EntityObject(float xa, float ya) { x = xa; y = ya; }
float getVelX() { return velX; }
float getVelY() { return velY; }
float getX() { return x; }
float getY() { return y; }
};
class Entity::Player : EntityObject
{
public:
Player(float xa, float ya) : EntityObject(xa, ya)
{
printf("Player created");
}
};
任何人都可以告诉我为什么
#include "Entity.h"
int main(int argc, char* argv)
{
Entity::init();
Entity::EntityObject* player = new Entity::Player(10.0f, 10.0f);
Entity::entities.push_back(player);
}
给出一个不完整/未定义的类型? 感谢。
编辑:
错误是:
这两个错误都指向此行:Entity::EntityObject* player = new Entity::Player(10.0f, 10.0f);
Error (active) E0070 incomplete type is not allowed
Error C2027 use of undefined type 'Entity::Player'
答案 0 :(得分:3)
您在.cpp文件中定义了Entity::Player
类,而不是在.h文件中。因此,即使main()
包含.h文件,它也不知道Entity::Player
。
答案 1 :(得分:1)
Entity :: Player在Entity.h中向前声明。
当编译器编译你的main.cpp模块时,除了它存在之外,它对这个类一无所知,特别是它不知道这个类作为构造函数采用两个float:Player(float xa,float ya)
=&GT;您的问题与前向声明有关,而与嵌套类无关。
阅读此主题以了解您的问题 What are forward declarations in C++?
阅读本文以了解您可以使用前向声明做什么以及不能做什么 When can I use a forward declaration?