在构造函数中传递指向数组的指针

Passing a pointer to an array in a constructor

本文关键字:数组 指针 构造函数      更新时间:2023-10-16

我需要在构造函数中传递一个指向数组的指针(我知道在C++中使用普通数组被许多人认为是不好的做法,但现在我只想继续它)。

请考虑以下代码:

// let's omit includes
class A {
   // irrelevant
}
class B {
    public:
    //irrelevant
    void someMethod() {
        _c = new C(array_id);
    }
    private:
    C* _c;
    A* array_id[SOME_CONST];
}
class C {
    public:
    C(A* a_array) : _array(a_array) {}
    private:
    A* _array;
}

尝试编译将导致:

error: no matching function for call to C::C(A* [SOME_CONST])'

据我所知,数组的标识符会衰减为指向数组第一个元素的指针,但它似乎无法直接使用。如何在C的构造函数中有效地传递指向a*数组的指针?

根据C++标准

4.2数组到指针的转换[conv.Array]
类型为"N T的数组"或"T的未知界的数组"的左值或右值可以转换到类型为"pointer to T"的prvalue。结果是指向数组的第一个元素。

修改你的代码如下:

   class C {
        public:
        typedef A* PTA[SOME_CONST];
        C(PTA a_array) : _array(a_array) {}
        private:
        A** _array;//Note this line,type decays.
    };

您有两个问题:第一个问题是使用指针的数组而不是数组来调用C构造函数。第二个问题是,您正试图将该分配分配分配给一个不兼容的类型。

解决方案可能类似

class B
{
public:
    void someMethod()
    {
        my_c = new C(my_a_array);
    }
private:
    A my_a_array[SOME_CONST];
    C* my_c;
};

这将分配一个类型为C单个对象,并将A对象的array传递给它。

如何在C的构造函数中有效地传递指向a*数组的指针?

C(array_id);

问题是C构造函数不接受A*的数组,而是接受A*

如果要将A*的数组传递给C构造函数,则需要声明它接受A**:

C(A** a_array)

或者,等效地:

C(A* a_array[])