在C ++中存储对数组的引用

时间:2014-05-18 07:21:19

标签: c++ arrays pointers

我有一个数组:

const int neoPixelCount = 40;
CRGB neoPixels[neoPixelCount];

我有一个Dancer,需要保留该数组的引用。它有init方法,如下所示:

// .h
class Dancer {
  public:
    CRGB neoPixels[];
    void init(CRGB neoPixels[]);
}

// .cpp
void Dancer::init(CRGB _neoPixels[]) {
  neoPixels = _neoPixels;
}

但是当我调用它时,编译器不会让我将引用传递给数组。

dancer->init(neoPixels);

哪个收益率:

  

discobot / Dancer.cpp:在成员函数'void Dancer :: init(CRGB *)'中:

     

discobot / Dancer.cpp:14:错误:将'CRGB *'分配给'CRGB [0]'的不兼容类型

使这项工作成功的正确语法是什么?为什么?

3 个答案:

答案 0 :(得分:2)

您只需要在类成员声明中将CRGB neoPixels[];更改为CRGB* neoPixels;,因为您希望存储指针(指向数组)而不是零/未知长度数组。

答案 1 :(得分:2)

如果你想要一个数组作为类成员的引用,你应该有类似的东西

class Dancer 
{
public:
    int (&neoPixels)[40]; // reference to an array of 40 elements
    Dancer(int (&neoPixels)[40]) : neoPixels(neoPixels) { }
};

成员neoPixels是对40个元素数组的引用(原谅对int的更改,它是在我的机器中进行检查)。

现在,因为它是一个引用,所以它应该在构造函数的初始化列表中初始化。

为了概括上述想法,您的类可以是一个模板,其中包含对已知大小的编译时数组的引用。

template<size_t N>
class Dancer
{
    public:
    int (&neoPixels)[N]; // reference to an array of N elements
    Dancer(int (&neoPixels)[N]) : neoPixels(neoPixels) { }
};

答案 2 :(得分:1)

我建议将Dancer更改为:

class Dancer {
  public:
    CRGB* neoPixels;
    void init(CRGB neoPixels[]);
}