分段错误访问私有类变量

#define TABLE_SIZE 100489 // must be a power of 2 typedef map<string,int> MAP_TYPE; typedef pair<string, int> PAIR_TYPE; class HashTable { public: //public functions HashTable(); ~HashTable(); int find(string); bool insert(string, int); private: int hash( const char* ); vector< MAP_TYPE > v; }; //HashTable constructor HashTable::HashTable() { vector< MAP_TYPE > v; //initialize vector of maps v.reserve(TABLE_SIZE); //reserve table size MAP_TYPE m; for (int i = 0; i < TABLE_SIZE; ++i) //fill vector with empty maps v.push_back(m); cout << v.size(); } int HashTable::find(string key) { cout << "in find" << '\n'; //String to const char* for hash function const char *c = key.c_str(); //find bucket where key is located int hashValue = HashTable::hash(c); cout << hashValue << '\n'; string s = key; cout << v.size(); //Prints 0 but should be TABLE_SIZE //look for key in map in bucket MAP_TYPE::const_iterator iter = v[hashValue].find(s); if ( iter != v[hashValue].end()) //check if find exists return iter->second; //return value of key else return -1; //arbitrary value signifying failure to find key } int main() { HashTable my_hash; string s = "hi"; int z = my_hash.find(s); cout << z; //should return -1 return 0; }

我测试了查找功能我的哈希表,但它返回一个分段错误。 即使我在查找功能构建的载体V配合合适的尺寸大小是现在0? 我不认为这是访问同一变量。 散列函数是好的。 怎么了?

--------------解决方案-------------

在C ++类变量在初始化列表初始化最好的:

HashTable::HashTable() : v(TABLE_SIZE, MAP_TYPE()) // **here**
{}

std::vector有一个构造函数大小和默认值,因此你可以调用。 事实上,自从使用默认值实际上是默认的构造函数创建的地图,你实际上可以只写下面的,因为第二个参数可以在这种情况下可以省略:

HashTable::HashTable() : v(TABLE_SIZE)
{}

你必须在函数调用V A局部变量以及私有类成员诉

尝试: this->v

你从来没有真正插入任何到私有成员变量的矢量v 。 您创建一个向量作为一个局部堆栈变量中,你还打着 v ,在你的哈希表的构造。 这样就可以进行项目插入该临时载体,只要你离开构造超出范围。 所以,当然,后来,在你的HashTable::find功能,类的成员变量v是空的。

你的构造应该是这样的:

//HashTable constructor
HashTable::HashTable()
{
this->v.reserve(TABLE_SIZE); //reserve table size
MAP_TYPE m;
for (int i = 0; i < TABLE_SIZE; ++i) //fill vector with empty maps
this->v.push_back(m);
}

上面我用this关键字强调的是,我在访问私有成员变量v ,但你并不需要它。 (虽然,通常是采用私有成员变量的命名规则,如添加一种好的做法_后缀或m_前缀或什么的。)

一个更好的方法来初始化向量是简单地用向量的填充构造,如R.费尔南德斯Martinho的答复建议。

分类:C# 时间:2012-04-03 人气:0
本文关键词: 类,变量,段错误
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.168 (s). 10 q(s)