2016-07-30 11 views
-1

OS kompilieren: Windows 7 64bit
IDE: Qt Creator 5.7.0 (32 Bit)
Compiler: MinGW 5.3.0 (32 Bit)
C++, Zeitfehler "keine Übereinstimmung für 'Operator []' (Operandentypen sind 'someclass *' und 'someclass')"

Als Vorwort, das ist eine Übung, um mir zu helfen einige Hinweise/Klassen Mechanik zu verstehen, so bool no = 1;, ich möchte nicht verwenden <vector> s noch andere easyToUse Werkzeuge.

Ich versuche, ein [Array von Zeigern auf someClass Typ Objekte] als Argument einer Funktion übergeben. Der ganze Code ist zu lang, um alles hier einzufügen, also poste ich einfach eine vereinfachte Version der Teile, die mit dem Fehler zusammenhängen.

Hier den Code (die relevanten Teile):

class someClass 
{ 
public: 
    someClass(){;} 
    someClass(unsigned int classConstructorArgIn); 
    ~someClass(){;} 
} 


someClass:someClass(unsigned int classConstructorArgIn) 
{ 
    //does stuff 
} 


void theFunction(someClass *arClassesIn, unsigned int arElementsIn); 


int main() 
{ 
    unsigned int arElements = someOperationsResult; //cant really write down how I calculate this value, you can test it with a const value, if you have to 
    someClass *arClasses[arElements] = {0}; //array of pointers to instances of someClass (allegedly!) 

    theFunction(arClasses[arElements], arElements); //BTW::I had to write the argument this way, otherwise it says the definition doesnt match any declaration 
    //Furthermore, I dont understand what kind of value I should actually type in there, whether the index of the first element (0) or the size of the array (arElements) 

    return 0; 
} 


void theFunction(someClass *arClassesIn, unsigned int arElementsIn) 
{ 
    unsigned int classConstructorArg = 0; 

    for (unsigned int i = 0; i < arElements; i++) 
    { 
     classConstructorArg = someOtherOperationsResult; 
     arClassesIn[(someClass)i] = new someClass(classConstructorArg); //ERROR::"no match for 'operator[]' (operand types are 'someClass*' and 'someClass')" 
     //For some reason that I dont understand, I had to cast the [i]ndex to (someClass) type, otherwise I get a whole bunch of errors about type conversion 
    } 
} 
+2

* Ich möchte weder noch andere easyToUse-Tools verwenden * - Sie müssen das Programm trotzdem schreiben, egal ob das Tool "einfach" ist oder nicht. Es ist nicht so, als würde die Verwendung von 'vector' das Programm auf magische Weise für Sie schreiben. – PaulMcKenzie

+0

@PaulMcKenzie Warum, habe ich es nicht geschrieben? '' s sollen die Verwendung von Arrays einfacher und sicherer machen, oder habe ich das falsch verstanden? –

+1

Wirklich, selbst wenn Sie nach einem [mcve] suchen, indem Sie Dinge entfernen, die den Fehler nicht beeinflussen, besteht eine Möglichkeit darin, dass Sie mit etwas wie 'class someClass {}; someClass obj = neu someClass(); '. Es gibt Ihnen den gleichen Fehler wie die Verwendung von 'i' für den Index (was der logischere Ansatz ist, wie Sie gesagt haben, und sowohl das als auch Casting auf' someClass' geben Fehler, also ...) macht es viel einfacher zu sehen, warum es scheitert. – chris

Antwort

1

Wenn Sie schreiben void theFunction(someClass *arClassesIn, unsigned int arElementsIn);, arClassesIn ist ein Zeiger auf ein Objekt vom Typ someClass. Es sieht jedoch so aus, als ob Sie ein Array von Zeigern übergeben möchten. So können Sie Ihre Funktion ändern müssen:

void theFunction(someClass **arClassesIn, unsigned int arElementsIn); 
// Or 
void theFunction(someClass *arClassesIn[], unsigned int arElementsIn); 

Dann können Sie es so nennen:

theFunction(arClasses, arElements); 

Und auch

arClassesIn[(someClass)i] = new someClass(classConstructorArg); 

von

arClassesIn[i] = new someClass(classConstructorArg); 

ersetzen

Was mit Ihrem Code falsch ist:

1.

theFunction(arClasses[arElements], arElements); 

arClasses[arElements] ist ungültig. arClasses ist ein Array der Größe arElements, gültige Indizes reichen von 0 bis arElements - 1. Der Zugriff auf einen anderen Index (wie arElements) kann zu Abstürzen führen.

2.

arClassesIn[(someClass)i] = new someClass(classConstructorArg); 

Als arClassesIn ist vom Typ someClass * und Sie werfen i-someClass der Compiler für eine Funktion wie folgt aussieht:

someClass operator[](someClass *a, someClass b) 

Eine solche Funktion in Ihrem Code nicht vorhanden ist, Deshalb haben Sie diesen Fehler (ERROR::"no match for 'operator[]' (operand types are 'someClass*' and 'someClass')).

Sie müssen i nicht umwandeln, um auf ein Array-Element zuzugreifen. Ihre vorherigen Fehler wurden wahrscheinlich verursacht, weil arClassesIn[i] vom Typ someClass ist, während new someClass(classConstructorArg) vom Typ someClass * ist. Dies wird behoben, indem der Prototyp theFunction wie oben beschrieben geändert wird.

+0

Yesssss !!! Es klappt! Ich bin mir nicht sicher, warum es so funktionieren muss. Vielleicht weil es ein Array von Zeigern ist und nicht nur ein Array? Ich denke schon. Wie dem auch sei, der vom Compiler berichtete Fehler ist ein völliger Unsinn, wie soll ich verstehen, was schief gelaufen ist ?! –

+0

@ZehryoKarham: Wie ist es "völliger Unsinn"? 'someClass *' und 'someClass **' sind unterschiedliche Typen. –

+0

Ich habe die Antwort aktualisiert, um einige Erklärungen hinzuzufügen. Nebenbei bemerkt, wenn Sie nicht verstehen, warum es so funktioniert, sollten Sie sich einige C-Tutorials zu Pointer und Arrays ansehen. –

Verwandte Themen