0

我在头文件和源文件之间拆分了以下代码。在函数 insert 中,它声明 AllBridges 向量没有初始化(它甚至似乎都没有识别它?)并且 nextBridge 没有被赋值——除非我认为我在构造函数中做了?

#include <vector>

using namespace std;

class Bridge
{
    public:
        Bridge(int);
        void insert(Bridge);

    private:

        int nextBridge;
        vector<Bridge> AllBridges;
};


#include "StdAfx.h"
#include "Bridge.h"

using namespace std;        

    Bridge::Bridge(int size){
        AllBridges.reserve(size);
        nextBridge= 0;      
    }

    void insert(Bridge AddBridge){
        AllBridges[nextBridge] = AddBridge;
    }
4

3 回答 3

6

应该

void Bridge::insert(Bridge AddBridge)

代替

void insert(Bridge AddBridge)
于 2012-05-27T00:17:53.470 回答
3

您正在尝试复制已经属于vector.

与其自己跟踪 nextBridge,不如让其vector完成它的工作,并跟踪bridge您插入了多少个 s。而不是insert在指定位置 ing,您只需要使用push_back添加到末尾vector,因此您的代码变为:

Bridge::Bridge(int size){
    AllBridges.reserve(size);
}

void Bridge::insert(Bridge AddBridge){
    AllBridges.push_back(AddBridge);
}

...您可以简单地nextBridge从您的定义中Bridge完全删除。

顺便说一句,我认为您犯了一个根本性错误:您将单个桥的概念与所有桥的集合的概念混为一谈。这是一个常见的错误(有时肯定不是初学者会犯),但它几乎不可避免地会导致问题。举个例子,Bridge你插入的每AllBridges一个AllBridges都有自己的(可能是空的,但谁知道呢)。

你真的Bridge只想代表一个桥,然后(如果需要)有一个单独的类型来代表桥的集合——如果它真的添加了一些有用的东西std::vector<Bridge>

编辑:我想我应该添加另一种可能性:也许您确实希望该Bridge类型跟踪所有实例化的自身实例。如果是这样,您希望成为AllBridges一个static成员,因此您为该类提供一个它的实例,而不是为该类的每个对象提供一个单独的实例。

于 2012-05-27T00:24:28.527 回答
2

调用reserveastd::vector可确保它有足够的容量来容纳如此多的元素(如果添加了这些元素)。它不会调整向量的大小,只会改变它的容量。您正在寻找的是resize.

您的成员函数定义中也缺少Bridge::您。insert

于 2012-05-27T00:18:21.820 回答