【问题标题】:Declarations required to iterate over an array of arrays of pointers to instances in C++在 C++ 中迭代指向实例的指针数组所需的声明
【发布时间】:2014-08-09 14:37:11
【问题描述】:

首先,我在这里瞄准 Arduino。请建议我使用 STL、Boost 或任何其他类型的库,或任何需要 newmalloc() 的库。这对我的情况不实用。

我有一堆指向Foo 实例的指针数组,声明如下:

Foo *group0[] = { &foo0, &foo1, &foo2};
Foo *group1[] = { &foo3, &foo4, &foo5};
Foo *group2[] = { &foo6, &foo7, &foo8};

如何声明这些组的数组并对其进行迭代?

(我一般理解数组、for 循环和指针,但声明的 C++ 语法让我很头疼。)

【问题讨论】:

  • 一般来说,我发现使用cdecl编写非平凡的C声明和引用是最容易的
  • 我试过了,但我什至无法理解:-P.

标签: c++ arrays arduino declaration


【解决方案1】:

下面的代码创建了一个组数组,然后对其进行迭代,为每个实例调用 Foo 方法 (foo[0-8])。它对所涉及的数组的内容(即 i 和 j 的边界)做了一些假设,但它应该适用于示例,并且应该很容易根据您的喜好进行自定义:

#include <iostream>

// Example Foo class (instantiated with foo[0-8]).
class Foo
{
    public:

        Foo(int x)
        {
            bar = x;
        }

        void FooMethod()
        {
            std::cout << bar << std::endl;
        }

    private:

        int bar;
};

int main(int argc, char* argv[])
{
    // Instantiate foo[0-8].
    Foo foo0 = Foo(0);
    Foo foo1 = Foo(1);
    Foo foo2 = Foo(2);
    Foo foo3 = Foo(3);
    Foo foo4 = Foo(4);
    Foo foo5 = Foo(5);
    Foo foo6 = Foo(6);
    Foo foo7 = Foo(7);
    Foo foo8 = Foo(8);

    // Declare Foo group arrays of, type Foo*.
    Foo* group0[] = { &foo0, &foo1, &foo2 };
    Foo* group1[] = { &foo3, &foo4, &foo5 };
    Foo* group2[] = { &foo6, &foo7, &foo8 };

    // Declare Foo* group array to hold Foo groups, of type Foo**.
    Foo** groups[] = { group0, group1, group2 };

    // Iterate through Foo groups and over each individual Foo object.
    for (int i = 0; i < 3; ++i)
    {
        for (int j = 0; j < 3; ++j)
        {
            // Do something with Foo (i.e. invoke its member method).
            groups[i][j]->FooMethod();
        }
    }
}

输出:

0
1
2
3
4
5
6
7
8

我希望这能回答您的问题。如果没有,请告诉我,我会看看我能做些什么:)

【讨论】:

  • 感谢您接受的回答!我希望这能解决您的问题。
  • 你完全赢了 a) 一个例子,证明你理解我在问什么,b) 回答我问的问题,c) 编译 d) 附带证明它有效的输出。 C++ 语法问题的血腥罕见情况。谢谢。
【解决方案2】:

由于 groupX 的大小相同,您可以使用:

using type = Foo* (*)[3];
type b[3] = {&group0, &group1, &group2};

【讨论】:

    【解决方案3】:
    Foo** list[] = {group0, group1, group2};
    Foo** pGroup;
    
    for(int i = 0; 3 < i; ++i)
    {
      pGroup = list[i]; // Ptr to one of the groups
    }
    

    然后只需取消引用 pGroup 即可获取组元素

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      • 2011-06-20
      相关资源
      最近更新 更多