【发布时间】:2012-07-14 19:17:52
【问题描述】:
好吧,我需要返回一个指向将在函数内创建的类的实例的指针。这样合适吗?
这是示例代码:
template <typename T>
ImplicatedMembershipFunction<T>*
TriangularMF<T>::minImplicate(const T &constantSet) const
{
static ImplicatedType* resultingSet = new ImplicatedType();
// do something to generate resultingSet...
return resultingSet;
}
我想返回指针,因为容器中需要有基类的子类。在上面的代码中,ImplicatedType 是在TriangularMF<T> 中定义的一个类,并且是从ImplicatedMembershipFunction<T> 派生的。会有各种模板类,如TriangularMF,它们有一个从ImplicatedMembershipFunction<T> 派生的嵌套类,我需要以同样的方式处理它们。例如,在图书馆之外,我可能想做一些类似的事情:
TriangularMF<double> trmf(0,1,2);
TrapesoidalMF<double> trpmf(0,1,3,2); // a class like TriangularMF but
// ImplicatedType is different
ImplicatedMembershipFunction<double>* itrmf = trmf.implicate(0.6);
ImplicatedMembershipFunction<double>* itrpmf = trpmf.implicate(0.6); // same as above.
// use them in the same way:
vector<ImplicatedMembershipFunction<double>*> vec;
vec.push_back(itrmf);
vec.push_back(itrpmf);
我不想使用移动语义或std::shared_ptr 等 C++11 功能的原因是我不想强迫我的队友在他们的计算机上安装更新版本的 g++。我不能给他们一个编译版本的库,因为它是大量模板化的。
编辑
该库将被线程化。特别是TriangularMF<T>::minImplicate 将同时在多个线程中运行。因此,将minImplicate 设为一个相互任务,对性能毫无意义。
【问题讨论】:
-
支持 C++11 的 GCC 版本可以追溯到很久以前。如果他们的版本不支持它,他们无论如何都应该升级。
-
我相信
static ImplicatedType* resultingSet = new ImplicatedType();会导致内存泄漏,因为您每次调用都会分配一个新实例,可能会丢失最后一个实例。 -
@Chowlett 不会,每个专业只会调用一次。
-
安全合法,定义明确,并不完全是邪恶的;合适是什么意思?
-
@sorush-r,也许这一切都是为了指出并解释优势。 This distribution 让它变得非常简单而且效果很好。
标签: c++ templates pointers c++11