【发布时间】:2015-01-08 23:20:49
【问题描述】:
我不是很精通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 ( int i = 0; i < (sizeof(allManagers) / sizeof(allManagers[0])); ++i )是一种 C-ish 方式。