【发布时间】:2019-09-23 01:41:06
【问题描述】:
我想遍历一个指向抽象类的指针数组以找到一个“空”槽,即检查一个元素是否指向派生类的对象。我的方法是创建数组并将每个元素设置为 nullptr。然后,我可以检查元素是否为 nullptr。
这可行,但有更好的方法吗? 编辑:我可以检查指向抽象类的指针数组中的第一个“空”元素(其中派生类将定期构造并由数组指向,呈现该元素不是“空”),而不分配每个元素在设置数组时设置 nullptr,然后检查 nullptr 作为检查元素是否“空”的一种方式?换句话说,我可以直接检查元素是否指向构造的基类吗?
Cat** catArray = new Cat*[200];
for(int i = 0; i < 200; i++){
catArray[i] = nullptr;
}
for(int i = 0; i < 200; i++){
if(catArray[i] == nullptr){ //edited, was typo as "!="
AddRealCat(...);
break;
}
}
我想知道是否有更简单的方法来执行此操作,即检查指向抽象类的指针数组中的元素是指向派生类的对象还是只是抽象指针,而不将元素设置为 nullptr。比如,标准库中有 bool IsObject(ObjectType* ptr) 之类的吗?
而且,我想知道将每个元素设置为 nullptr 是否会带来任何潜在问题,除了循环遍历数组并将元素设置为 nullptr 的计算成本。
【问题讨论】:
-
那是什么?你想找到空白点(
nullptr是绝对合理的)还是找出指针是否指向特定类的对象(你会使用类似if(dynamic_cast<Cat*>(catArray[i]))的东西)? -
您可以存储一个
size_t,指示最后一个Cat的存储位置。或者您可以使用std::vector或任何其他标准容器代替数组。甚至你也可以使用std::optional来解决这些问题。 -
您的设置中没有“抽象指针”之类的东西。你能描述一下你所说的那句话是什么意思吗?此外,如果一个元素没有被设置为一个值,那么检查它的值是未定义的行为。 (这就是为什么指针应该始终设置为某个值的原因;
nullptr值带有“我不指向任何东西”的语义。) -
有什么理由不使用
std::vector<Cat*>吗?或者更好的是std::vector<std::unique_ptr<Cat>>? -
Cat*[i] = nullptr;是一个语法错误,它肯定不会“工作”
标签: c++ arrays pointers abstract-class nullptr