C ++所以为什么错误:'operator ='

时间:2016-11-01 09:32:40

标签: c++ arrays class

所以我只是想创建一个自定义类bcLED的对象数组,我收到了错误。 错误:'operator ='不匹配(操作数类型为'bcLed'和'bcLed *')

有人可以告诉我为什么吗?我知道这会很简单。

为什么我在这里有一种方法可以在C ++中创建一个未指定长度的数组,然后每次我想要添加一个对象时,只需要添加一个新行?

void PopulateLEDS(){
    int i;
    bcLed ledArr[17];
    for (i = 0; i< 16; i++)
    {
       ledArr[i] = new bcLed();
       ledArr[i].id = i;
       ledArr[i].charge = 0;
    }
}

好的,所以我需要更多的帮助

为了避免创建一万个帖子,我将粘贴代码的主体,以便查看我在使用C ++语法绊倒的地方。

lattest错误

/Users/bencawley/Documents/Arduino/Test/Bens_Lights/Bens_Lights.ino: In function 'void PopulateLEDS()':
Bens_Lights:49: error: expected primary-expression before 'public'
     public:bcLed ledArr[17];
     ^
Bens_Lights:52: error: 'ledArr' was not declared in this scope
        ledArr[i].id = i;
        ^
/Users/bencawley/Documents/Arduino/Test/Bens_Lights/Bens_Lights.ino: In function 'void BensPattern(uint8_t)':
Bens_Lights:69: error: 'ledArr' was not declared in this scope
       strip.setPixelColor(i,0, 0, ledArr[i].charge, 0);
                                   ^
Using library Adafruit_NeoPixel at version 1.0.6 in folder: /Users/bencawley/Documents/Arduino/libraries/Adafruit_NeoPixel 
exit status 1
expected primary-expression before 'public'

我的代码是:

class bcLed{
    public:int id;
    public:int charge;

    void incCharge(int amt)
    {
        charge = charge+amt;
        if(charge >= 255){charge = 255;}
    }
};

void setup() {
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'

  PopulateLEDS();
}

void loop() {
  // Some example procedures showing how to display to the pixels:
  BensPattern(45);

}

void PopulateLEDS(){
    int i;
    bcLed ledArr[17];
    for (i = 0; i< 17; i++)
    {
       ledArr[i].id = i;
       ledArr[i].charge = 0;
    }
}

void BensPattern(uint8_t wait) 
{
    uint16_t i, j;
    int rn = rand() % strip.numPixels() ;

    for (i = 0; i<strip.numPixels(); i++)
    {
      strip.setPixelColor(i,0, 0, 0, 0);
    }

    for (i = 0; i<rn; i++)
    {
      strip.setPixelColor(i,0, 0, ledArr[i].charge, 0);
      ledArr[i].incCharge(1);
    }

      strip.show();
      delay(wait);
}

2 个答案:

答案 0 :(得分:3)

在C ++中始终不需要

new,绝对不会在这里。如果自动分配对您来说不够好,new会为您分配动态内存。如果您希望变量超出其范围,通常只使用new。分配有new的内存也必须始终为delete d,以避免内存泄漏。在现代C ++中,使用new的需求更少,因为我们有智能指针。

bcLed ledArr[17];

这已经为你创建了17个bcLed(就像你在C#中使用new一样,不需要清理),不需要对它们使用new。只是和他们一起工作..你的循环条件也是错误的,它应该是< 17

for (i = 0; i < 17; i++)
{
   ledArr[i].id = i;
   ledArr[i].charge = 0;
}
  

为什么我在这里有一种方法来创建一个未指定的数组   在C ++中的长度,然后每次我想要的时候只需要添加一个新行   添加一个对象吗?

是的,那是std::vector的用途:

#include <vector>
std::vector<bcLed> ledArr(17);

//loop over them:
for(int i = 0; i < ledArr.size(); ++i)
{
  //ledArr[i]
}

//or:
for(std::vector<bcLed>::iterator itr = ledArr.begin() itr != ledArr.end(); ++itr)
{
  //*itr
}

// to insert to the back of the vector use push_back:

bcLed aLed;
ledArr.push_back(aLed);

如果您有权访问C ++ 11,则可以使用基于范围的循环,并使用emplace_back

#include <vector>
std::vector<bcLed> ledArr(17);

//loop over them, just to iterate:
for(const auto& led : ledArr)
{
  //led.id
  //led.charge
}

//appending to the vector:

ledArr.emplace_back(/*constructor arguments*/);

回答你的评论

  

好的我会勇敢地问你这个问题,如果你想要的话   变量可以比它的范围更长,或者你在低级别工作   存储器&#34;我不明白这是什么意思......主要是我   不明白你的范围或低级别记忆是什么意思。您可以...吗   解释那些?范围是该方法运行的时间?

变量的范围是定义它的上下文。自动存储一直持续到它的范围结束。大括号{ }表示范围。例如:

void foo()
{
  int x;
  bcLed aLed;
  { //create a new inner scope
    bcLed innerLed;   
  } //scope ends, all automatic variables are destroyed (innerLed in this case)

  //can't use `innerLed` here.

  int new_int = x; 
} // scope ends, same goes, new_int, x, aLed are destroyed.

实际上,一本好书会告诉你这些差异以及何时应该使用它们。

答案 1 :(得分:1)

ledArr[i] = new bcLed();不起作用,正如错误消息所述,您无法将bcLed(即bcLed*)的指针指定给bcLed

对于bcLed ledArr[17];,数组的17个元素是默认构造的;您根本不需要new一个。因此,只需删除导致错误的代码,以下代码就可以正常工作。

bcLed ledArr[17];
for (i = 0; i < 16; i++)
{
   ledArr[i].id = i;
   ledArr[i].charge = 0;
}
  

有没有办法在C ++中创建一个未指定长度的数组,然后每次我想向它添加一个对象时,只需要添加一个新行?

这就是std::vector应该做的事情。

如果要处理数组的所有元素,for的条件应为i < 17