C ++构造函数问题,未设置值

时间:2010-06-06 22:08:53

标签: c++ constructor initialization

我是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;

3 个答案:

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