出于我正在制作的节目的目的,我试图做这样的事情:
void instantiate(myType t){
t = new myType();
}
int main(){
myType* t = NULL;
.
.
.
instantiate(t);
.
.
.
if (t != NULL){
do something;
}
}
然而,任何了解C ++的人都知道,在退出该函数的范围之后,t将继续为NULL。但有没有办法按我的意愿做这项工作?为了清楚起见,它必须是一个void函数(不能像" t = instantiate()"),因为它将用于在同一函数中实例化多于一种类型的类
编辑:songyuanyao的评论解决了我的问题,但是由于评论中的人建议如果我提供更多关于我的场景的详细信息,可能会有更好的解决方案,这里是:void instantiateHash(Ohash*& OH, Chash*& CH, HOhash*& HOH, int type, int size, int limit){
if (type == 1){
OH = new Ohash(size, type);
}else if (type == 2){
CH = new Chash(size, type);
}else{
HOH = new HOhash(size, limit);
}
}
void insertIntoHash(Ohash*& OH, Chash*& CH, HOhash*& HOH, string s){
//The functions for operations in the hashtables are different for each type
if (OH != NULL){
OH->insert(s);
}else if (CH != NULL){
CH->insert(s, CH->table, CH->size);
}else{
HOH->insert(s, CH->table, CH->limit);
}
}
void mainMenu(int t, int s, int l){
Ohash* OH = NULL;
Chash* CH = NULL;
HOhash* HOH = NULL;
string str;
//Instantiates a particular type of hashtable according to the type variable
instanciateHash(OH, CH, HOH, t, s, l);
cout<<"Enter the word you want to insert into your new hashtable:"<<endl;
cin<<str;
//then inserts something into it
insertIntoHash(OH, CH, HOH, str);
}
int main(){
int type, size, limit;
.
//intructions that ask the user to enter the 3 values for type, size and limit
.
mainMenu(type, size, limit);
}
以上是我的程序结构的简化表示。我想拥有可以在三种类型的哈希表上运行的泛型函数。我相信我处理它的方式看起来非常业余,但这是因为它是一个非常古老的代码,我现在正在为一个大学项目添加新东西。我试图学习使用模板,虚函数,但它比我预期的要难(因为虽然每个类都有相同操作的函数(如插入,删除等),但它们有不同的构造函数,有些函数接收不同的参数,我现在没有时间从头开始重写所有内容。
答案 0 :(得分:0)
从C ++ 17开始,你可以使用std::variant
来保存3种不同实现中的一种,即使它们不共享公共接口。
当然,如果他们这样做,只需使用多态,只需将指针声明为基类型。
您发现的部分解决方案仍然存在问题,但是泄漏了。您将需要编写一个匹配的析构函数,再次删除实例化的对象,或者更简单:只使用智能而不是原始指针,从C ++ 11开始就可以使用它们。
具体而言,std::unique_pointer
适用于此用例。为了分配它而通过引用传递指针的模式仍然适用于智能指针,除了你不必担心指针已经拥有对象。