我目前正在研究模板类(我很遗憾)。 我想构建一个可以存储对象的模板类。
这是我的.h文件:
#ifndef STORAGE_H_
#define STORAGE_H_
#include <iostream>
using namespace std;
template<class T,int maxsize>
class Storage
{
public:
Storage();
int getSize();
T get(int index);
bool add(T element);
private:
T array[maxsize];
int length;
};
template<class T,int maxsize>
Storage<T,maxsize>::Storage()
: length(0),// Liste d'initialisation des données membres
{}
template<class T,int maxsize>
int Storage<T,maxsize>::getSize()
{
return length;
}
template<class T,int maxsize>
T Storage<T,maxsize>::get(int index)
{
return array[index];
}
template<class T,int maxsize>
bool Storage<T,maxsize>::add(T element)
{
if (length>=maxsize) return false;
array[length++]=element;
return true;
}
#endif /* STORAGE_H_ */
例如,当我处理int时它工作正常。但是当涉及到其他对象时,我之前使它失败了。 在我的主.cpp文件中:
Storage<Pokemon,4> pokemonArray;
它向我发送了以下错误:
no matching function for call to 'Pokemon::Pokemon()'
口袋妖怪是我的一个班级。对我来说,这一行意味着它无法找到构造函数Pokemon()。
我怎样才能让它发挥作用?
谢谢你们!
答案 0 :(得分:2)
以下代码将起作用,假设Pokemon有一个默认构造函数:
#include <iostream>
using namespace std;
template<class T,int maxsize>
class Storage
{
public:
Storage();
int getSize();
T get(int index);
bool add(T element);
private:
T array[maxsize];
int length;
};
template<class T,int maxsize>
Storage<T,maxsize>::Storage()
: length(0)
{}
template<class T,int maxsize>
int Storage<T,maxsize>::getSize()
{
return length;
}
template<class T,int maxsize>
T Storage<T,maxsize>::get(int index)
{
return array[index];
}
template<class T,int maxsize>
bool Storage<T,maxsize>::add(T element)
{
if (length>=maxsize) return false;
array[length++]=element;
return true;
}
class Pokemon{
public: Pokemon(){};
};
int main(){
Storage<Pokemon,4> pokemonArray;
}
请注意,如果没有给出构造函数,编译器将自动生成一个,代码仍然可以编译。
class Pokemon{
//no constructors is still ok
};
默认构造函数由Storage类中的Array隐式调用。你很可能在你的Pokemon类中有一个非平凡的构造函数导致了这个问题。也许是这样的:
class Pokemon{
public:
Pokemon(std::string name){
//....
}
//...
};
当你提供一个非平凡的构造函数时,编译器不会隐式添加一个,因此,你需要更改你的Storage类,或者给你的当前构造函数的Pokemon类一个默认构造函数:< / p>
class Pokemon{
public:
Pokemon(){}; //<-- needed
Pokemon(std::string name){ ... }; //<-- optional
};
答案 1 :(得分:1)
由于您的Storage
模板化类具有固定大小T
(即Pokemon
个对象)的数组:
template<class T, int maxsize>
class Storage
{
public:
Storage();
int getSize();
T get(int index);
bool add(T element);
private:
T array[maxsize]; // Array
int length;
};
当您尝试实例化该类的对象时,您应该确保Pokemon
类具有可见的默认构造函数来初始化该对象数组。以下不会起作用:
class Pokemon {
public:
Pokemon() = delete;
};
int main(void)
{
Storage<Pokemon, 4> pokemonArray;
return 0;
}
解决方案:确保该类具有默认构造函数或change your design(内部存储的智能指针的std::vector
怎么办?)
答案 2 :(得分:1)
你的错误很简单:
您正在使用初始化存储空间。
使用未初始化的存储来存储这些成员,例如匿名工会
当您接管了包含的T
元素的生命周期管理时,您需要编写自己的copy-ctor,move-ctor,copy-assignment,move-ctor和析构函数。
另一种方法是重新使用已经通过动态存储为您做的标准容器,但看起来您想构建自己的并避免堆。
或者,您知道,通过为其提供默认值,确保您的类型是默认构造的。