2017-04-23 41 views
1

所以我创建一个封闭的散列哈希表一类的载体的情况下,我有一个结构C++段故障解除引用的指针结构

struct Example { 
    string key; 
    string data; 

    Example() { key = "000"; } 
}; 

和一个类,其中包含一个部件,其分到一个结构向量,一个构造函数和一个我将用来说明问题的函数。

class hash_table { 
    private: 
    vector<Example>* hash; 

    public: 
    hash_table(int size); 
    void dummy_method(); 
}; 

它意味着根据用户/文件输入动态分配向量中的结构数量。

hash_table :: hash_table (int size=10) 
{ 
    //initialize vector 
    vector<Example> * hash = new vector<Example>(size); 
    //test objects 
    for(int i=0;i<size;i++) 
    cout<<(*hash)[i].key<<endl; 
} 

上述代码出现初始化10个成员,它打印出“000” 十倍。

然而,当我尝试通过调用dummy_method-

void hash_table::dummy_method() { 
    cout<<(*hash)[0].key<<endl; 
} 

我得到一个分段错误

我敢肯定,这甚至不是这样做的正确的方式,但我我一直在寻找/修补,我似乎无法找到解决方案。然而,我绝对必须使用指向结构向量的指针,而且我很确定我应该动态地分配每个结构(以某种方式)。谢谢你的帮助。

(也,是的,我们确实有使用的命名空间,因此没有任何地方STD)

+3

您应该存储一个矢量,而不是指向矢量的指针。这将减少错误的范围。 – juanchopanza

+0

什么是“htable”?它是如何定义的?请发布一个完整的示例代码,重现您所问的问题。否则很难给出有用的答案。 – emlai

+0

抱歉,htable来自较大的程序。我将较大程序中的功能复制到较小的程序中,以便找出问题。我编辑它以反映正确的代码。截至目前,这是一个完整的程序,所以任何问题都应该被隔离。 –

回答

2

vector<Example> * hash = new vector<Example>(size);表达将初始化一个局部变量名hash,不是hash_table::hash成员(这是未初始化)。

+0

非常感谢你澄清这一点。你知道是否有一种简单的方法来动态初始化hash_table :: hash成员,并用动态分配的结构填充它?对不起,如果这是一个愚蠢的问题,我的大脑有点难以想象全部。 –

+0

您只需要移除'vector *'部分,甚至将其重写为'this-> hash'来明确表明您正在处理类成员。像这样的名字冲突在C++中是非常麻烦的,你可能想要使用一些命名约定来防止这种情况,比如成员变量以'm_'开始,常规变量总是用lower_case写成,函数总是用CamelCase写成,类型名称以't_',名字空间以'n_'开头。 – VTT

+0

我知道在有人回答的时候我会感到难以置信的愚蠢,我没有错。我非常感谢帮助。 –