使用嵌套类时的不完整/未定义类型

时间:2017-10-24 10:32:24

标签: c++ visual-studio-2017

我一直试图制作一些代码,但我对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'

2 个答案:

答案 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?