2013-03-08 3 views
9

Ich habe einen enum-Parameter in einem C++ - Programm, das ich mit einer Funktion erhalten muss, die den Wert über einen Parameter zurückgibt. Ich begann damit, es als Int zu deklarieren, aber bei der Code-Überprüfung wurde gebeten, es als enum (ControlSource) einzugeben. Ich tat dies, aber es bricht die Get() -Funktion - ich bemerkte, dass eine C-Style-Umwandlung in int & das Problem löst, aber als ich zuerst versuchte, es mit einem static_cast zu beheben <> kompilierte es nicht.Warum kann ich static_cast <int&> nicht verwenden, um einen Integer-Referenzparameter an eine Funktion in C++ zu übergeben?

Warum ist das, und warum ist es so, dass wenn eTimeSource ein int war, überhaupt kein Casting erforderlich ist, um die ganze Zahl als Referenz zu übergeben?

//GetCuePropertyValue signature is (int cueId, int propertyId, int& value); 

ControlSource eTimeSource = ControlSource::NoSource; 

pPlayback->GetCuePropertyValue(programmerIds.cueId, DEF_PLAYBACKCUEPROPERTY_DELAY_SOURCE, static_cast<int&>(eTimeSource)); //This doesn't work. 

pPlayback->GetCuePropertyValue(programmerIds.cueId, DEF_PLAYBACKCUEPROPERTY_DELAY_SOURCE, (int&)(eTimeSource)); //This does work. 

int nTimeSource = 0; 
pPlayback->GetCuePropertyValue(blah, blah, nTimeSource); //Works, but no (int&) needed... why? 
+0

„Works, aber kein (int &) benötigt ... warum?“ Nehmen - Sehen Sie in der C++ - Dokumentation nach, wie Sie Variablen per Referenz übergeben (oder siehe hier: http://stackoverflow.com/a/410857/1174378) –

+0

Entfernen Sie die doppelten Klammern. Bin ich richtig in der Vermutung, dass die C-Stil-Besetzung einen reinterpret_cast für dieses Objekt aufruft, damit es funktioniert? Wenn ja, ist es wirklich wichtig für eine Enumeration, die auf dem Int-Typ basiert? – Gareth

+0

Nein, "reinterpret_cast" ist nicht dasselbe wie ein "Vorschlaghammer" im C-Stil. Wenn Sie einen hässlichen Hacky Cast benötigen, um den Code nach dem Ändern des Typs funktionieren zu lassen, dann ändern Sie den Typ nicht! Es funktioniert OK mit 'int', es funktioniert nicht OK mit einer enum ...scheint ziemlich klar, was die Antwort zu mir ist –

Antwort

8

Wenn Sie eine Variable auf einen Wert eines anderen Typs umwandeln, erhalten Sie einen temporären Wert, der zu einer nicht konstanten Referenz gebunden ist, kann nicht sein: Es macht keinen Sinn, die vorübergehend zu ändern.

Wenn Sie nur müssen lesen den Wert, sollte eine konstante Referenz in Ordnung sein:

static_cast<int const &>(eTimeSource) 

Aber Sie könnten auch nur einen tatsächlichen Wert schaffen, anstatt eine Referenz:

static_cast<int>(eTimeSource) 
+0

In der Besetzung von static_cast (eTimeSource) der Compiler sagt mir, dass es eine entsprechende Überlastung der Funktion nicht finden kann und das gleiche gilt für static_cast (eTimeSource). Ich möchte nicht wirklich die GetProperty-Funktion aktualisieren, um eine const-Referenz zu nehmen, da ich vermute, dass es dazu führen würde, viele Änderungen an anderer Stelle vorzunehmen. – Gareth

+1

@Gareth: Dann machen Sie eine lokale Variable, 'int i = static_cast (eTimeSource);' und rufen Sie die Funktion mit 'i'. –

+0

Fair genug - das würde natürlich funktionieren. Es ist ein bisschen zirkulär, aber ich habe angefangen, indem ich meine Variable als int deklarierte, ohne überhaupt zu casten, aber der Rezensent mochte es nicht! Ich sehe seinen Punkt - richtig erklären, der Typ macht es klar, was es ist, aber es bringt dieses Problem mit sich ... – Gareth

3
static_cast<int&>((eTimeSource))); //This doesn't work. 

Richtig, es funktioniert nicht, weil eTimeSource kein int ist so können Sie keinebindendazu.

Falsch, das funktioniert auch nicht, es scheint nur zu. Der C-Style-Cast liegt beim Compiler und sagt "mach es einfach so, auch wenn das nicht legal ist". Nur weil etwas kompiliert, heißt das nicht, dass es funktioniert.

warum ist es, dass, wenn eTimeSource war ein int kein Casting überhaupt erforderlich ist, die ganze Zahl von Referenz zu übergeben?

Da Sie ein int&, um eine int aber nicht auf eine andere Art binden kann, und eTimeSource ist eine andere Art. Eine int& ist eine Bezugnahme auf eine int. Wenn Sie es an einen anderen Typ binden könnten, würde es sich nicht auf eine int beziehen, oder?

Wenn der Code Kritiker sagte, die Variable auf einen Aufzählungstyp für Sie sie wahrscheinlich auch die Funktionsparameter zu ändern, sollten ändern, um ein ControlSource&

+0

Was ist, wenn 'ControlSource' tatsächlich eine'Enum-Klasse' ist? Angesichts des OPs-Codes ist das eine Option AFAICS ... –

+0

ControlSource ist eine C++ - Native-Enumeration, keine Enum-Klasse oder Ref-Enumeration. Darüber hinaus wollte oder erwartet der Prüfer nicht, dass der Parameter in den Enum-Typ geändert wird - die zugrundeliegende Datenspeicherklasse basiert auf dem Wert, der als Int eingegeben wird. Es ist akzeptiert worden, dass dies der Fall bleiben sollte (da die Einführung des Enum-Typs zu lange dauern würde - ist es nicht trivial, da eine GetMethod-Delegiertensignatur weiter unten den Unterschied zwischen der enum und dem int nicht unterscheiden kann Überlasten in einer Drehung). Die 'richtige' Signatur funktioniert nicht mit der Zeit, die ich ATM zur Verfügung habe! – Gareth

+0

@DanielFrey, würde das irgendetwas in meiner Antwort ändern? (TBH ich lese es nur kurz neu, also wenn es das bitte korrigiert) –

Verwandte Themen