为什么我不能访问我的成员变量?

时间:2012-05-27 00:16:18

标签: c++

我在头文件和源文件之间分配了以下代码。在函数插入中,它表示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;
    }

3 个答案:

答案 0 :(得分:6)

应该是

void Bridge::insert(Bridge AddBridge)

而不是

void insert(Bridge AddBridge)

答案 1 :(得分:3)

您正在尝试复制已经属于vector的功能。

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

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

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

...您只需从nextBridge的定义中删除Bridge即可。

顺便说一句,我认为你犯了一个根本性的错误:你把一座桥的概念与所有桥梁的概念混为一谈。这是一个常见的错误(有时由绝对不是初学者的人制作),但它几乎不可避免地导致问题。例如,您插入Bridge的{​​{1}}每个AllBridges都有AllBridges个(这可能是空的,但谁知道)。

你真的希望Bridge 代表一个桥,然后(如果需要)有一个单独的类型来表示一个桥的集合 - 如果它确实添加了一些有用的东西{ {1}}。

编辑:我想我应该添加另一种可能性:也许你确实希望std::vector<Bridge>类型能够跟踪所有实例化的实例。如果是这样,你想让你的Bridge AllBridges成员,所以你有一个类的实例,而不是该类的每个对象的单独实例。

答案 2 :(得分:2)

reserve上调用std::vector可确保它有足够的容量来托管这么多元素(如果已添加)。它不会调整矢量大小,只会改变其容量。您要找的是resize

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