c++为什么错误:no match for 'operator='

C++ so why error: no match for 'operator='

本文关键字:operator for match 为什么 错误 no c++      更新时间:2023-10-16

所以我只是想让我的自定义类bced的对象数组,我得到的错误。错误:没有匹配'operator='(操作数类型为' bced '和' bced *')

谁能告诉我为什么?我知道会很简单。

也为什么我在这里有一种方法来创建一个未指定长度的数组在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;
    }
}

所以我需要更多的帮助

为了避免创建10,000个帖子,我将粘贴代码的主体,以便查看我在c++语法中出错的地方。

最新的错误是

/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);
}

new在c++中并不总是需要的,在这里也绝对不需要。如果自动分配不够好,new会为您分配动态内存。如果你想让变量超出它的作用域,你通常只使用new。用new分配的内存也必须始终是delete d,以避免内存泄漏。在现代c++中,new的使用甚至更少了,因为我们有了智能指针。

bcLed ledArr[17];

这已经为你创建了17个bcLed s(就像你在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*/);

回答你的评论

好吧,我要勇敢地问这个问题,当你说"如果你想。变量超出它的作用域,或者您正在使用低级别"我完全不明白这是什么意思……大多数情况下我不明白你所说的作用域或低级内存是什么意思。你能解释这些?作用域是方法运行的时间吗?

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

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.

说真的,一本好书会告诉你它们的区别,以及何时应该使用它们。

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

相关文章: