gpt4 book ai didi

c++ - 以旧方式迭代 C++ 中的对象指针数组(没有基于范围的 for)?

转载 作者:太空狗 更新时间:2023-10-29 23:50:43 24 4
gpt4 key购买 nike

我不是很精通C++,但是我得到了下面的代码:

BaseManager* allManagers[] =
{
mColorManager,
mToolManager,
mLayerManager,
mPlaybackManager,
mViewManager
};

for ( BaseManager* pManager : allManagers )
{
pManager->setEditor( this );
pManager->init();
}

我使用 older g++ ,所以我不能使用-std=c++11,我必须使用-std=c++0x。查看 error: expected initializer before ‘:’ token 中的“老派”等效项,我希望以下内容会起作用:

for ( auto it = allManagers.begin(); it != allManagers.end(); ++it )
{
BaseManager* pManager = *it;
pManager->setEditor( this );
pManager->init();
}

...但它失败了:

error: request for member ‘begin’ in ‘allManagers’, which is of non-class type ‘BaseManager* [5]’
error: unable to deduce ‘auto’ from ‘<expression error>’

所以我收集了,因为这个 allManagers 显然只是一个 C 数组,它不是一个有方法的对象(比如 .begin)——所以最后,我终于得到了要编译的那部分:

for ( int i=0 ; i<5 ; i++ )
{
BaseManager* pManager = allManagers[i];
pManager->setEditor( this );
pManager->init();
}

... 但是,这需要我手动写入数组长度,我不喜欢这样。

因此,我的问题是:在不使用基于范围的 for 循环的情况下遍历此类指针数组的正确方法是什么 - 而且无需显式输入硬编码数组长度?

最佳答案

您可以使用:

for ( auto it = std::begin(allManagers); it != std::end(allManagers); ++it )
{

但是,这些也是 C++11 的特性。一些 C++11 之前的编译器可能支持它们,但不能保证。

如果没有可用的 C++11 编译器,您可以使用:

size_t numObjects = sizeof(allManagers)/sizeof(allManagers[0]);
for ( size_t i = 0; i < numObjects; ++i )
{
BaseManager* manager = allManagers[i];

关于c++ - 以旧方式迭代 C++ 中的对象指针数组(没有基于范围的 for)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27851336/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com