声明和访问类中对象的向量。给链接器错误

时间:2015-10-14 21:30:43

标签: c++ class c++11 vector

背景:我有一个更大的程序,我决定通过创建粒子发射器来练习矢量。所以我创建了一个名为Particle的类,它执行了粒子的东西,然后创建了一个名为ParticleEmitter的类来处理粒子。计划是它的核心粒子发射器将具有Particels的向量,因为这是学习如何使用向量的练习。 问题:它没有编译。我收到了链接错误。

  

错误1错误LNK2019:未解析的外部符号__imp___CrtDbgReportW在函数“public:class Particle& __thiscall std :: vectorParticle,class std :: allocator> :: operator [](unsigned int)”中引用“(?? A? $ vector @ VParticle @@ V?$ allocator @ VParticle @@@ std @@@ std @@ QAEAAVParticle @@ I @ Z)... \ projects \ MyExperiment \ Main.obj MyExperiment

原始错误让我试着去掉一些在Main之前声明和定义的虚拟类。

#include <vector>

class Particle {
private:
    double xPos_;
    double yPos_;

public:
    Particle();
    void setMe(double a, double b);
};

Particle::Particle() {
    xPos_ = 0;
    yPos_ = 0;
}

void Particle::setMe(double a, double b) {
    xPos_ = a;
    yPos_ = b;
}

class ParticleEmitter {
private:
    ParticleEmitter();
    std::vector<Particle> particleArray_;

public:
    void Populate();
    void Update();
};

ParticleEmitter::ParticleEmitter() {
    particleArray_.reserve(5);
}

void ParticleEmitter::Populate()  {
    Particle newParticle;
    newParticle.setMe(23, 45);
    particleArray_.push_back(newParticle);
    particleArray_.push_back(newParticle);
}

void ParticleEmitter::Update()  {
    for (std::vector<Particle>::size_type i = 0; i < particleArray_.size(); i++)
    {
        particleArray_[i].setMe(i, i + 1);
    }
}

错误的触发器是最后一行:particleArray_[i].setMe(i, i + 1); 如果我发表评论,它编译得很好。 问题是,如果我只将这个准系统代码复制到一个新项目,它编译得很好。

在我的主项目中,我没有#includes会干扰这一点,只有<iostream>"SDL.h"。也没有其他类似名称的变量等。

尝试解决方案:访问向量的3种不同方式:

    for (std::vector<Particle>::size_type i = 0; i != particleArray_.size(); i++)
        {
            particleArray_[i].SetxVel(particleArray_[i].GetxVel() + (GRAVITY_CONSTANT * timeSlice) / 1000);
            // Other stuff
        }

    for (std::vector<Particle>::size_type i = 0; i != particleArray_.size(); i++)
    {
        Particle& pA = particleArray_[i];
        pA.SetxVel(pA.GetxVel() + (GRAVITY_CONSTANT * timeSlice) / 1000);
             // Other stuff

    }

    for (std::vector<Particle>::iterator it = particleArray_.begin(); it != particleArray_.end(); ++it)
    {
        it->SetxVel(it->GetxVel() + (GRAVITY_CONSTANT * timeSlice) / 1000);
        // Other stuff
    }

这是来自原始代码,其中GetxVel和SetxVel是Particle类的公共函数。访问向量的所有三种方法的共同点是由于链接错误而无法编译。 在原始代码中,析构函数也被定义/声明(空)。

所以真正的问题是:我做错了吗?为什么它会给出链接错误? 任何见解或进一步阅读都是最受欢迎的。我已经猛烈抨击我和谷歌这一天了很多天......

0 个答案:

没有答案