【问题标题】:Vector of Custom Objects自定义对象的向量
【发布时间】:2014-01-04 09:15:13
【问题描述】:

我正在尝试创建一个在头文件中定义的自定义对象向量,然后在实际的 cpp 文件中初始化它们。我在 Visual Studio 中遇到以下错误:

error C2976: 'std::vector' : too few template arguments
error C2065: 'Particle' : undeclared identifier
error C2059: syntax error : '>'

在下面的代码中,向量在 Explosion.h 中定义。

粒子.h:

#pragma once
class Particle : public sf::CircleShape {
public:
    float speed;
    bool alive;
    float vx;
    float vy;
    Particle(float x, float y, float vx, float vy, sf::Color color);
    ~Particle();
};

粒子.cpp:

#include <SFML/Graphics.hpp>
#include "Particle.h"

Particle::Particle(float x, float y, float vx, float vy, sf::Color color) {
    // Inherited
    this->setPosition(x, y);
    this->setRadius(5);
    this->setFillColor(color);

    // Player Defined Variables
    this->speed = (float).05;
    this->alive = true;
    this->vx = vx;
    this->vy = vy;
}

Particle::~Particle() {
}

Explosion.h:

static const int NUM_PARTICLES = 6;

#pragma once
class Explosion {
public:
    std::vector<Particle*> particles;
    bool alive;
    Explosion();
    ~Explosion();
};

Explosion.cpp:

#include <SFML/Graphics.hpp>
#include "Particle.h"
#include "Explosion.h"

Explosion::Explosion() {
    this->alive = true;

    // Add Particles to vector
    for (int i = 0; i < NUM_PARTICLES; i++) {
        this->particles.push_back(new Particle(0, 0, 0, 0, sf::Color::Red));
    }
}

Explosion::~Explosion() {
}

我确信这里有一些根本性的错误,因为 C++ 对我来说相当新。

【问题讨论】:

    标签: c++ object inheritance vector sfml


    【解决方案1】:

    您需要告诉Explosion.h Particle 是什么。

    在这种情况下,Explosion.h 使用的是Particle*,因此转发声明就足够了。

    Explosion.h

    class Particle; // forward declaration of Particle
    
    class Explosion {
    // ...
    };
    

    您也可以简单地 #include "Particle.h,但是随着您的项目增加,使用前向声明(而不是直接包含)可以显着减少您的构建时间。

    【讨论】:

    • 前向声明是否必要?看起来Explosion.h 需要#include "Particle.h"
    • 任何一种方式都可以。随着代码库的增长,将首选前向声明,因为减少直接包含的数量可以显着减少构建时间。
    • 还建议他避免使用C原始指针,new和delete;支持无泄漏智能指针
    • @ssell:你可能会说,“including 是必要的文件吗?看起来Explosion.h 只需要转发声明类。”
    • @Mitch:我建议您阅读更准确的内容。 C++11 的标准智能指针可以非常愉快地存储在容器中。 (在 2011 年之前情况并非如此,但希望您正在学习现代 C++)。
    猜你喜欢
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多