2016-11-01 10 views
-1

So bin ich nur versucht, ein Array von Objekten meiner benutzerdefinierten Klasse zu machen bcLED und ich bin mit dem Fehler. Fehler: keine Übereinstimmung für 'operator =' (Operandentypen sind 'bcLed' und 'bcLed *')C++ also warum Fehler: keine Übereinstimmung für ‚operator =‘

Kann mir jemand sagen warum? Ich weiß, es wird etwas Einfaches sein.

auch, warum ich hier bin gibt es eine Möglichkeit, ein Array einer nicht spezifizierten Länge in C++ zu erstellen und dann fügen Sie es einfach mit einer neuen Zeile jedes Mal, wenn ich ein Objekt hinzufügen möchten?

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

OK so brauche ich mehr Hilfe

Um die Schaffung zehntausend Beiträge vermieden werde ich den Hauptteil des Codes, so dass einzufügen, um zu sehen, wo ich mit der C++ Syntax bin Stolpern.

die lattest Fehler sind

/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' 

Und mein Code:

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); 
} 
+5

Kommen Sie zufällig aus einem Java-Hintergrund? – StoryTeller

+1

Sie haben ein Array von 17 'bcLed'. Sie versuchen, ein 'bcLed *' zuzuweisen. Wenn Sie nicht eine 'operator =' overload für 'bcLed' definiert haben, die eine rechte Seite von' bcLed * 'nimmt, wird das nicht funktionieren (und Sie wollen es wahrscheinlich sowieso nicht). Sie brauchen diese Zuweisungsanweisung * überhaupt nicht. Sie haben bereits 17 'bcLed' Objekte. – WhozCraig

+0

'ledArr [i]' ist 'bcLed'. 'new bcLed()' gibt 'bcLed *' zurück – zvone

Antwort

3

new wird nicht immer in C++ benötigt, und definitiv nicht hier. new reserviert dynamischen Speicher für Sie, wenn die automatische Zuweisung nicht gut genug für Sie ist. Normalerweise verwenden Sie nur new, wenn die Variable ihren Gültigkeitsbereich überschreiten soll. Der mit new belegte Speicher muss auch immer delete d sein, um ein Speicherleck zu vermeiden. In modernen C++ wird die Verwendung von new noch weniger benötigt, da wir Smart Pointer haben.

bcLed ledArr[17]; 

Dies schafft bereits 17 bcLed s für Sie (wie, wie Sie new in C# verwenden würde, erfordert keine Bereinigung), keine Notwendigkeit new auf sie zu nutzen. Nur mit ihnen arbeiten .. Ihre Schleifenbedingung falsch ist auch, es soll < 17 sein.

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

also why i am here is there a way to create an array of an unspecified length in C++ and then just append it with an new row each time I want to add an object to it?

Ja, das ist, was ein std::vector ist für:

#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); 

Wenn Sie Zugriff auf C haben 11 ++ Sie eine Auswahl auf Basis Schleife stattdessen verwenden können und verwenden 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*/); 

An Beantworten Sie Ihren Kommentar

ok im going to brave and ask this when you say "if you want the variable to outlive it's scope or you're working with low level memory" I don't understand what any of that means... well mostly I don't understand what you mean by scope or low level memory. Could you explain those? is scope the time that the method runs for?

Ein Bereich einer Variablen ist der Kontext, in dem sie definiert ist. Der automatische Speicher bleibt bis zum Ende seines Gültigkeitsbereichs bestehen. Klammern { } geben den Umfang an. Zum Beispiel:

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. 

Wirklich obwohl, ein gutes Buch wird Ihnen sagen, die Unterschiede und wann sollten sie eingesetzt werden.

+0

Betrachte auch 'emplace_back', um Elemente in C++ 11 direkt zu konstruieren. – Asu

+1

@Asu Hinzufügen von C++ 11 Leckereien in einem bisschen. –

+0

ok ich werde mutig und frage das, wenn du sagst "wenn du willst, dass die Variable ihren Umfang überlebt oder du mit Low-Level-Speicher arbeitest" Ich verstehe nicht, was das bedeutet ... naja, meistens nicht Ich verstehe, was Sie unter "Scope" oder "Low Level Memory" verstehen. Kannst du das erklären? ist der Umfang der Zeit, für die die Methode ausgeführt wird? – skyzzle

1

ledArr[i] = new bcLed(); funktioniert nicht, da die Fehlermeldung sagte, erhalten Sie einen Zeiger auf bcLed nicht zuordnen kann (dh bcLed*) zu einem bcLed.

bcLed ledArr[17]; Für die 17 Elemente der Matrix wurde standardmäßig aufgebaut ist; Sie brauchen new überhaupt nicht. So entfernen Sie einfach den Code, der Fehler verursacht, der folgende Code würde gut funktionieren.

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

is there a way to create an array of an unspecified length in C++ and then just append it with an new row each time I want to add an object to it?

Das ist, was std::vector tun soll.


Wenn Sie alle Elemente des Arrays verarbeiten will, sollte die Bedingung fori < 17 sein.

Verwandte Themen