4

我在让这个工作时遇到问题,

class A {
public:
    A(int n) {
        a = n;
    }
    int getA() {
        return a;
    }
private:
    int a;
};

int main(){

    A* a[3];
    A* b[3];

    for (int i = 0; i < 3; ++i) {
        a[i] = new A(i + 1);
    }

    void * pointer = a;

    b = (A* [])pointer;  // DOESNT WORK Apparently ISO C++ forbids casting to an array type ‘A* []’.
    b = static_cast<A*[]>(pointer); // DOESN'T WORK invalid static_cast from type ‘void*’ to type ‘A* []’

    return 0;
}

而且我不能使用泛型类型来满足我的需要。

提前致谢。

4

2 回答 2

10

数组在 C 中是二等公民(因此在 C++ 中也是如此)。例如,您不能分配它们。如果不将它们降级为指向第一个元素的指针,就很难将它们传递给函数。
在大多数情况下,指向数组第一个元素的指针可以像数组一样使用 - 除非您不能使用它来获取数组的大小。

当你写

void * pointer = a;

a被隐式转换为指向其第一个元素的指针,然后将其强制转换为void*.

从那里,你不能让数组回来,但你可以得到指向第一个元素的指针:

A* b = static_cast<A*>(pointer);

(注意:指向不相关类型的指针之间的转换需要 a reinterpret_cast,除了void*隐式转换和 fromvoid*到任何其他指针的转换,这可以使用 a 完成static_cast。)

于 2010-10-12T17:14:23.400 回答
9

也许你的意思是

memcpy(b, (A**)pointer, sizeof b);

?

一个static_cast版本也是可能的。

于 2010-10-12T17:36:00.817 回答