如何为MyClass **传递MyClass [] []?

时间:2013-06-16 20:44:14

标签: c++ pointers multidimensional-array casting

为什么我不能通过

    Point src[1][4] = {
        {
            Point(border,border), Point(border,h-border), Point(w-border,h-border), Point(w-border,h-border)
        }
    };

作为

polylines(frame, src, ns, 1, true, CV_RGB(255,255,255), 2); 

,其中

折线有原型

void polylines(Mat& img, const Point** pts, const int* npts, int ncontours, bool isClosed, const Scalar& color, int thickness=1, int lineType=8, int shift=0 )

更新

好的,好的,我记得这些东西:)

4 个答案:

答案 0 :(得分:4)

Point[1][4]无法以这种方式转换为Point** 看看这个问题:Converting multidimensional arrays to pointers in c++

这里的实际解决方案是 使用STL容器而不是C风格的数组 ,例如std::vector

typedef std::vector<Point> Shape;
std::vector<Shape> myShapes;
...

并通过const引用而不是const指针传递它:

void polylines(Mat& img, const std::vector<Shape>& shapes, ...)

另请注意,srcnspts等不是您的变量的非常幸运的名称。尝试选择更有意义的名字......如果不是为了你自己,那么为了未来的代码读者而这样做:)

答案 1 :(得分:2)

因为他们不是一回事。 polylines要求指向指针Point的指针,但是你给它指向Point的数组[4]的指针。

重新说明:当你使用src作为这样的表达式时,它会从数组衰减成指针。在这种情况下,它将从Point[1][4]衰减到Point(*)[4],即指向类型为Point的大小为4的数组的指针。这是4个Point对象的内存位置。 polylines期望指针的内存位置为Point对象。

答案 2 :(得分:1)

数组数组和指针指针并不意味着相同的内存布局。数组数组包含连续的所有元素,而指针指针需要一个连续指针数组,这些指针指向(可能是非连续的)连续元素数组。

要进行转换,您需要分配一个指针数组,并让它们指向数组数组中的正确条目。在您的情况下,由于您只有一组值,因此更简单:

Point * pointer = &src[0][0];
int npts = 4;
polylines(img, &pointer, &npts, 1, ...);

假设ncontours是指向指针的指针数,npts是各个指针所指向的点数。

答案 3 :(得分:0)

请检查此问题:casting char[][] to char** causes segfault?

简短回答:你永远不应该这样做