【发布时间】:2014-07-30 17:51:53
【问题描述】:
我遇到了一个特殊的问题。我以为我知道相当多的 C++,但我一定忽略了一些细微差别?
我有一些模板类,基本上所有发生的事情都是基于某种条件,一个对象正在从一个 std::list 移动到另一个。
这里关注的方法是doAndGet(T *t)。我的意图是让 t 以NULL 的形式出现(或者其他什么,我真的不在乎,但它应该是NULL 或nullptr,如果我最终将T 元素*t 从myList 到 myOtherList,我希望 T *t 指向被移动的项目。
现在可能有一些关于std::list 的东西我不知道,但是当单步执行我的代码时,t 被正确分配并且——最初我认为在方法返回之后,但后来发现——对在ret 指令之前,参数T *t 被设置回NULL
任何大师都可以阐明这个问题吗?真是让我头疼……
template<typename T, typename C>
class Base : IsDerivedFrom<T, C>
{
public:
typedef std::list<T*> SpecialList;
virtual bool doAndGet( T* t ) = 0;
protected:
SpecialList myList;
};
template<typename T>
class Derived : public Base<T, Other>, public Other
{
public:
Derived( void );
virtual ~Derived( void );
bool doAndGet( T* t );
protected:
typename Base<T, Other>::SpecialList myOtherList;
};
template<typename T>
bool Derived<T>::doAndGet( T *t )
{
// Nothing to process
if (myOtherList.empty()) {return false;}
t = (*myOtherList.begin());
myOtherList.pop_front();
if (true/* some condition needs to be moved */)
{
t->status = 1;
this->myList.push_back(t);
return true;
} else
{
// Something bad happened...
delete t;
t = nullptr;
return false;
}
}
// Use... (pretend I defined MyOtherClass somewhere, not important)
Derived<MyOtherClass> derivedInstance;
MyOtherClass *t = nullptr;
if ( derivedInstance.doAndGet(t) )
{
// ... Here I should expect `t` to be not `NULL` and not `nullptr`
// This however, is not ever the case in my testing...
}
【问题讨论】:
-
doAndGet无法修改传入的t,因为它是按值传递的。如果您在doAndGet中分配t应该有副作用,请通过引用获取t(例如T*&)。 -
您的基类缺少虚拟析构函数(但这不是问题)。
-
你是如何在不了解 pass-by-value 的情况下学习模板、多重继承、奇怪重复的模板模式的 :)
标签: c++ templates pointers arguments