2012-05-27 185 views
0

我有下面的代码拆分头和源文件。在函数插入它的状态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; 
    } 
+0

您应该使用成员初始值设定项语法来初始化构造函数中的变量,而不是显式赋值语句。 – chris

回答

6

应的

void Bridge::insert(Bridge AddBridge) 

代替

void insert(Bridge AddBridge) 
+0

@JerryCoffin我刚刚看到错误信息和原因。在你的回答中你解释得很好。此外,我确信一旦他编译并运行代码,他自己就会看到问题。可以是一个很好的学习体验。 –

+0

公平 - 你回答他问的问题,而不是他应该问的问题。 :-) –

+0

@JerryCoffin我真的没有读到整个事情(不合格的名字弹出)。也许我应该有。现在编辑没有意义。 –

2

调用上std::vectorreserve确保它有足够的能力来举办这样的很多元素,如果加入他们。它不调整矢量大小,它只会改变它的容量。你在找什么是resize

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

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); 
} 

...你可以简单地从你的Bridge定义中删除nextBridge完全。另外,我认为你正在犯一个根本的错误:你将一座桥的概念与所有桥梁的概念混为一谈。这是一个常见的错误(有时候肯定不是初学者),但它几乎不可避免地导致问题。举例来说,您插入到AllBridges中的每个Bridge都有自己的AllBridges(这可能是空的,但是谁知道)。

你真的想Bridge只是代表单桥,然后(如有必要)有一个单独的类型来表示桥梁的集合 - 如果它确实增加了一些超出std::vector<Bridge>有用。

编辑:我想我应该添加一个其他的可能性:也许你真的想要Bridge类型来跟踪自己的所有实例的实例化。如果是这样,你想让你的成员,所以你有一个它的类的实例,而不是它的一个单独的实例,每个对象的类。

相关问题