<分区>
我遇到了一个特殊问题。我以为我了解相当多的 C++,但我一定忽略了一些细微差别?
我有一些模板类,基本上所有发生的事情都是基于某种条件,一个对象正在从一个 std::list 移动到另一个。
这里关注的方法是doAndGet( T *t )。我的意图是让 t 以 NULL
的形式出现(或者其他什么,我真的不在乎,但它应该是 NULL
或 nullptr
,如果我最终将 T
元素 *t
从 myList
移动到 myOtherList
,我想要 T *t
指向被移动的项目。
现在也许有一些关于 std::list
我不知道的东西,但是当单步执行我的代码时,t
被正确分配并且 - 最初我方法返回后想到,后来发现——就在ret
指令之前,参数T *t
被设置回NULL
/p>
任何大师都可以阐明这个问题吗?这真是让我头疼...
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...
}