所以我只是想创建一个自定义类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);
}
答案 0 :(得分:3)
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
。