我是C ++的新手,我正试图找出我的一个类的构造函数所带来的这个问题。会发生什么......除了两个(健康和类型)之外,我的所有变量都被正确初始化。
#pragma once
#include <irrlicht.h>
#include <vector>
#include <cassert>
using namespace irr;
using namespace core;
using namespace scene;
enum
{
PLAYER = 0,
NPC = 1,
SOLDIER = 2,
CHAINGUNNER = 3
};
class Model
{
public:
Model(void);
Model(int id, std::vector<ISceneNode*> modelVec, int modType);
~Model(void);
std::vector<int> path;
std::vector<ISceneNode*> model;
int endNode;
int type;
int animate;
int health;
u32 lastAnimation;
private:
int mId;
};
#include "Model.h"
Model::Model(void)
{
//assert(false);
}
Model::Model(int id, std::vector<ISceneNode*> modelVec, int modType)
{
path = std::vector<int>();
model = modelVec;
endNode = 0;
type = modType;
animate = 0;
health = 100;
lastAnimation = 0;
mId = id;
}
Model::~Model(void)
{}
我使用模型士兵(id,model,SOLDIER)创建模型 除了类型和健康之外,一切都正确设置。我尝试了很多不同的东西,但我无法弄清楚我的问题。我不确定是否正在调用默认构造函数。它没有意义,因为我没有调用那个构造函数。
谢谢,
vector<ISceneNode*> model;
model.push_back(soldierBody);
model.push_back(soldierHead);
model.push_back(soldierWeapon);
cout << "Id of char: " << id << endl;
Model soldier(id, model, SOLDIER);
modelMap[id] = soldier;
答案 0 :(得分:2)
从评论中,您说您将这些插入到地图中,如下所示:
modelMap[id] = Model(id, model, SOLDIER);
std::map::operator[]
要求映射类型是默认可构造的。当您在地图上调用operator[]
时,如果给定键没有映射值,则地图默认构造一个新对象,将其映射到给定键,并返回对该对象的引用。
您可以使用std::map::insert()
:
modelMap.insert(std::make_pair(id, Model(id, model, SOLDIER));
答案 1 :(得分:2)
这一行:
modelMap[id] = soldier;
首先默认在地图内构建模型 然后,返回的引用与赋值运算符一起使用,将soldier的值复制到映射中包含的值中。
要测试它是否正常工作,请尝试:
Model soldier(id, model, SOLDIER);
std::cout << "TYPE(" << soldier.type << ") HEALTH(" << soldier.health << ")" std::endl;
modelMap[id] = soldier;
std::cout << "TYPE(" << modelMap[id].type << " HEALTH(" << modelMap[id].health << ")" std::endl;
如果您的课程不是默认可构建的。
然后没有默认的构造函数(这只会导致问题)
在类的私有部分声明一个默认构造函数(不需要正文)。
如果没有默认构造函数,您将无法在地图上使用运算符[]。但是你可以通过使用insert来解决这个问题:
modelMap.insert(std::map<XX, Model>::value_type(id, soldier));
答案 2 :(得分:1)
你这样做:
Model soldier(id, model, SOLDIER); //1
modelMap[id] = soldier; //2
这里发生了什么?
1.使用您提供的consructor创建新对象。
2.调用所谓的复制构造函数复制赋值运算符将soldier
复制到modelMap[id]
。您还没有定义自己的 copy-constructor 复制赋值运算符,因此编译器会为您创建一个默认值,在大多数情况下,只是将逐字节的整个数据结构复制到新内存中地址。但是你的类中有指针的向量,所以编译器应该调用vector的copy-constructor ...我不知道(也许有经验丰富的人会知道现在发生了什么)结果是什么 copy-构造函数,我不知道标准是否明确定义了'default copy-constructor'。
所以有可能将整个结构复制到modelMap[]
但是有一些随机数据。
如果你创建一个拷贝构造函数(在你的情况下它的声明看起来像如果你覆盖复制赋值运算符(最好,如果你做了两件事),你可以控制在将对象复制到另一个变量/对象时完成的所有操作。Model::Model(const Model& myModel);
,copy-constructor总是引用它的类型的对象作为参数)
下载例如。 Bruce Eckel的 Thinking in C ++,V。1 [1],或者在网上的某个地方搜索怎么做(可能这样会很好,没有读完整篇文章,http://www.learncpp.com/cpp-tutorial/911-the-copy-constructor-and-overloading-the-assignment-operator/)
[1]可以在他的网站mindview.net上下载,作为一个新用户,我只能粘贴一个链接,所以不能自己链接到这里:P。