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

Iterating through array of object pointers in C++ the old way (without range-based for)?

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

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

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

我使用的是 older g++, so I cannot use -std=c++11, and I have to use -std=c++0x. Looking at the "old-school" equivalent in 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 循环的情况下迭代这样一个指针数组的正确方法是什么 - 而且还不必显式输入硬编码数组长度?

allManagers 不是容器。它是一个指针数组,因此你不能使用 .begin().

如果您想确定数组的大小,只需这样做:

int n = sizeof(allManagers)/sizeof(allManagers[0]);

检查 this 问题了解更多。请注意,您的数组在堆栈中。

要么跟踪变量中的数组长度,要么使用 std::array 或 std::vector。

编辑:如果您想创建自己的 ArrayLen() 方法,您可以这样做:

template<class T, size_t Size>
static inline size_t ArrayLen(const T(&arr)[Size])
{
    return Size;
}

那么你可以这样做:

for(size_t i = 0; i < ArrayLen(allManagers); ++i)
{
    BaseManager * pManager = allManagers[i];

您可以使用:

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];