以旧方式迭代 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];
我不是很精通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];