有一天我很无聊,所以我创建了这个库:
template <class X, class Y> class HASH
{
public:
HASH(X element, Y key)
{
elements=new X[0];
keys=new Y[0];
keys[0]=key;
elements[0]=element;
num_elements=0;
};
~HASH ()
{
delete[] elements;
delete[] keys;
};
void Add(X element, Y key)
{
for (int x=0; x<=num_elements; x++)
{
if (keys[x]==key)
{
throw(key);
}
}
//make copy variables
X *copy_elements=new X[num_elements];
Y *copy_keys=new Y[num_elements];
//copy all the elements
for (int x=0; x<=num_elements; x++)
{
copy_elements[x]=elements[x];
copy_keys[x]=keys[x];
}
//delete the originals
delete[] elements;
delete[] keys;
//resize the originals
elements=new X[num_elements+1];
keys=new Y[num_elements+1];
//copy everything back to the originals
for (int x=0; x<=num_elements; x++)
{
elements[x]=copy_elements[x];
keys[x]=copy_keys[x];
}
//delete the copies
delete[] copy_keys;
delete[] copy_elements;
//increment num_elements
num_elements++;
//add the new elements
elements[num_elements]=element;
keys[num_elements]=key;
};
X operator [] (Y key)
{
int num=0;
for (int x=0; x<=num_elements; x++)
{
if (keys[x]==key)
{
num=x;
break;
}
}
return elements[num];
};
Y KeyNum(int x)
{
return keys[x];
};
int NumElements()
{
return num_elements;
};
private:
int num_elements;
X *elements;
Y *keys;
};
然后我测试了它,它运作了。所以现在我正在尝试创建一个源代码如下的实验:
#include <hash.cpp>
#include <iostream>
using namespace std;
class OBJECT
{
public:
OBJECT(string name, int number)
{
int_properties=new HASH <string, int>;
};
~OBJECT()
{
delete int_properties;
};
HASH <string, int> *int_properties;
};
int main()
{
OBJECT a("name", 5);
return 0;
}
并且它返回错误:
brain.cpp: In constructor ‘OBJECT::OBJECT(std::string, int)’: brain.cpp:10: error: no matching function for call to ‘HASH<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int>::HASH()’ /usr/include/hash.cpp:4: note: candidates are: HASH<X, Y>::HASH(X, Y) [with X = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Y = int] /usr/include/hash.cpp:2: note: HASH<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int>::HASH(const HASH<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int>&)
我做了很多测试,无论我做什么,我似乎无法初始化一个对象,它是另一个对象的数据成员。我只是不明白为什么。
答案 0 :(得分:2)
您声明了一个带有HASH<X, Y>
参数的构造函数:
HASH(X element, Y key)
{
elements=new X[0];
keys=new Y[0];
keys[0]=key;
elements[0]=element;
num_elements=0;
};
然后尝试在HASH<string, int>
中分配OBJECT::OBJECT
:
OBJECT(string name, int number)
{
int_properties=new HASH <string, int>;
};
您只需将name
和number
传递给HASH<string, int>
的构造函数:
int_properties=new HASH <string, int>(name, number);
答案 1 :(得分:1)
brain.cpp: In constructor ‘OBJECT::OBJECT(std::string, int)’: brain.cpp:10: error: no matching function for call to ‘HASH, std::allocator >, int>::HASH()’
没错。您尚未为HASH类定义默认构造函数。
答案 2 :(得分:1)
在C ++中,对象当然可以是其他对象的数据成员。否则你只会有由原始类型组成的类,而这几乎没用。
这里的问题是您的class HASH
没有默认构造函数。
如果您根本没有指定构造函数,那么编译器将为您创建一个deafault构造函数。但是一旦定义了非默认构造函数,编译器就不再提供默认构造函数。
因此,您必须将元素和键传递给您正在创建的HASH
对象,或者您必须为class HASH
提供默认构造函数,这可能会创建一个空哈希表。
答案 3 :(得分:1)
没有默认构造函数:
int_properties=new HASH <string, int>; // No constructor that takes zero arguments to HASH
答案 4 :(得分:1)
您的HASH类没有默认构造函数。 你的OBJECT构造函数应该是
OBJECT(string name, int number)
{
int_properties=new HASH <string, int>(name, number);
};
答案 5 :(得分:1)
int_properties = new HASH <string, int>;
此行尝试调用class HASH<string, int>
的默认构造函数。也就是说,它尝试调用零对象的构造函数。但是没有这样的构造函数。您定义的构造函数是HASH<string, int>::HASH(string element, int key)
,它需要两个参数。
模板参数显示在<>
中。功能参数显示在()
中。不要混淆两者。
您可以使用通过添加一些函数参数定义的构造函数来解决此问题:
int_properties = new HASH<string, int> (name, number);
或修改或重载构造函数,使其可以采用零参数并成为默认构造函数。
template <class X, class Y> class HASH {
public:
HASH();
//...
};
template <class X, class Y> HASH<X,Y>::HASH() { /*...*/ }
答案 6 :(得分:0)
HASH是一个模板类,你不能直接实例化它。