假设您有类型T
和子类型TSub1
,TSub2
等。
其中一些子类型使用new TSub(...)
初始化。然后将结果指针存储为:
list<T*> tsList;
相同的指针也用作以下键:
map<T*,V> tsMap;
现在考虑使用迭代器变量tsList
进行tIter
的迭代。
以下是我的问题:
tsMap[*tIter]
和tsMap.find(*tIter)
都会成功 找到正确的关联值?
delete *tIter
会成功释放完整内存块 已分配给相关的TSub
,即使STL将类型视为 的T
- 醇>
假设已定义方法
T::foo()
并覆盖TSub::foo()
。
(*tIter)->foo()
会调用T::foo()
或TSub::foo()
吗?
上下文是:希望每个TSub
以单例形式实例化,但以允许迭代考虑作为超类型的方式存储,并调用子类中重写的方法。
我非常感谢您提供明智的解释。谢谢你的时间!
答案 0 :(得分:6)
tsMap [* tIter]和tsMap.find(* tIter)都会成功找到 正确的相关价值?
是的,但如果tsMap [* tIter]找不到密钥,它将创建一个默认值。
将删除* tIter成功释放分配的完整内存块 对于相关的TSub,即使STL将类型视为T?
当且仅当T的析构函数是虚拟的
假设有一个已定义的方法T :: foo()并覆盖TSub :: foo()。
Will(* tIter) - &gt; foo()调用T :: foo()或TSub :: foo()?
如果T :: foo不是虚拟的,它将调用T :: foo。否则它将调用TSub :: foo()
答案 1 :(得分:0)
我建议从提升中查看Pointer Container Library。
另外,我建议
tsMap [* tIter]和tsMap.find(* tIter)是否都能成功找到正确的关联值?
取决于成功的定义。如果指针标识是关键标识,则是。如果需要比较指向对象,则需要提供一个比较器函数对象( c ++ 0x中的
效率相当低的PoC :(见http://ideone.com/TpgLw)
#include <map>
#include <functional>
template <typename T>
static bool indirectLess(const T* a, const T* b)
{
if (a==b)
return false;
if (!a)
return true;
if (!b)
return false;
return std::less<T>()(*a, *b);
}
typedef int T;
typedef int V;
int main()
{
typedef bool (*cmp_t)(const T*, const T*);
std::map<T*,V,cmp_t> tsMap(&indirectLess<T>);
}