背景:我有一个更大的程序,我决定通过创建粒子发射器来练习矢量。所以我创建了一个名为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类的公共函数。访问向量的所有三种方法的共同点是由于链接错误而无法编译。 在原始代码中,析构函数也被定义/声明(空)。
所以真正的问题是:我做错了吗?为什么它会给出链接错误? 任何见解或进一步阅读都是最受欢迎的。我已经猛烈抨击我和谷歌这一天了很多天......