Frage

In vielen C ++ API (COM-basiert ist in dem Sinne), dass etwas für Sie, den Zeiger auf das Objekt, das in der Regel aufgebaut ist, wird als ** Zeiger erforderlich (und die Funktion wird konstruieren und init es für Sie)

Sie sehen in der Regel Unterschriften wie:

HRESULT createAnObject( int howbig, Object **objectYouWantMeToInitialize ) ;

-. Aber man selten sieht das neue Objekt als Rückgabewert übergeben wird

Neben Menschen Fehlercodes sehen wollen, was ist der Grund dafür? Ist es besser, das ** Muster zu verwenden, anstatt ein zurückgegebene Zeiger für einfachere Operationen wie:

wchar_t* getUnicode( const char* src ) ;

Oder wäre besser, dies wie folgt geschrieben werden:

void getUnicode( const char* src, wchar_t** dst ) ;

Das Wichtigste, was ich denken kann, ist daran zu erinnern, es zu befreien und die ** Art und Weise, aus irgendeinem Grund, neigt dazu, mich daran zu erinnern, dass ich es auch ausplanen haben.

War es hilfreich?

Lösung

„Außerdem wollen Fehlercodes“?

Was macht Sie glauben, es is ein neben. Fehlercodes sind so ziemlich der einzige Grund. Die Funktion benötigt eine gewisse Art und Weise Fehler anzuzeigen. C keine Ausnahmen hat, so ist es, dass entweder durch einen Zeiger Parameter oder Rückgabewert zu tun hat, und der Rückgabewert ist idiomatisch und einfacher zu überprüfen, wenn die Funktion aufgerufen wird.

(By the way, gibt es keine allgemeine Regel, dass ** Mittel Sie das Objekt frei haben. Das ist nicht immer der Fall, und es ist wahrscheinlich eine schlechte Idee zu verwenden, um etwas, dass beliebige Sie daran zu erinnern, welche Objekte zu bereinigen.)

Andere Tipps

Zwei Gründe kommen mir in den Sinn.

Zuerst sind Fehlercodes tatsächlich. Anders als C ++, C nicht über Ausnahmen und COM ist ein C-API. Auch viele C ++ basierte Projekte bevorzugen keine Ausnahmen aus verschiedenen Gründen zu verwenden. Es kann Fälle geben, in denen ein Rückgabewert nicht Fehler signalisieren kann, zum Beispiel wenn Ihre Funktion einen Integer zurückgibt, kann es keine ganze Zahl sein, die einen Fehlercode darstellen kann. Während Fehler mit Zeigern Signalisierung ist leicht (NULL == Fehler), bevorzugt einig API-Designer Signalfehler in einer konsistenten Art und Weise über alle Funktionen.

Zweitens können Funktionen haben nur einen Rückgabewert, sondern nannte sie können mehrere Objekte erstellen. Einige Win32-API-Funktionen übernehmen mehrere Zeiger auf Zeiger, die optional gefüllt werden können, wenn Sie diese Funktionen mit nicht-NULL-Zeiger nennen. Sie können nicht zwei Zeiger zurückgeben, oder besser gesagt würde dies unangenehm sein, zu verwenden, wenn der Rückgabewert einige Struktur von Wert ist mehr als ein Zeiger enthält. Auch hier ist eine konsistente API ist ein sinnvolles Ziel zu erreichen.

Neue Objekte in Funktionsargumente von ** bestanden ist besser. Diese nehmen mir einen Trost für die zukünftige Verwendung des Wandels void zu bool zum Beispiel auf Rückkehr Erfolg einer Funktion oder einer anderen Funktion funktioniert Informationen.

Antwort in einer Zeile:. Das ist viel besser für die daraus entstehende Fehlercodes

  

Neben Menschen wollen, Fehlercodes, um zu sehen, was ist der Grund dafür?

Es gibt einige Gründe dafür. Einer von ihnen ist eine Schnittstelle zu schreiben, die in C verwendbar ist (Sie sehen dies in der WinAPI und Windows COM).

Die Abwärtskompatibilität ist ein weiterer Grund (das heißt die Schnittstelle wie das geschrieben wurde und es brechen würde jetzt vorhandenen Code brechen).

würde ich mit C-Kompatibilität für ein Konstruktionsprinzip gehen, wenn der Code wie folgt verwenden. Wenn Sie in C ++ zu schreiben, sind Sie würden schreiben

retval Myfunction(Result *& output);

statt

retval Myfunction(Result ** output);

oder (noch besser):

Result *Myfunction();

und hat die Funktion, eine Ausnahme auf Fehler werfen.

Ich bin nicht sicher, ich stimme, dass der beste Weg, es zu tun ... das könnte besser sein:

Object * createAnObject(int howbig, HRESULT * optPlaceResultCodeHereIfNotNull = NULL);

Auf diese Weise gibt es keine Spielerisch mit Doppel indirection (das ist ein wenig kompliziert für Menschen sein kann, die sind es nicht gewohnt), und die Menschen, die über Rückmeldungen nicht kümmern müssen sich keine Sorgen machen über das zweite Argument überhaupt ... sie können nur, wenn der Rückgabewert NULL oder nicht überprüfen, um zu sehen ist.

Eigentlich, da es C ++ ist, könnte man die Dinge noch einfacher, mit der Funktion Überlastung:

Object * createAnObject(int howbig);
Object * createAnObject(int howbig, HRESULT & returnResultCode);

Jeder Aufruf-Methode in einem COM-Aufruf muß HRESULT. Der Rückgabecodes erhält ganzen Rahmen gehebelt und einen Doppelzeiger vorbei ist ein bekannter Weg, um das erstellte Objekt zu erhalten.

Ihre Frage nicht beantworten, aber ein Kommentar als Ihre Frage einige Gedanken brachte ich über COM / DCOM-Programmierung mit C ++.

Alle diese „Zeiger“ und „Zeiger auf Zeiger“, Speicherverwaltung und Referenzzählung sind die Gründe, warum ich tun COM-Programmierung mit C ++ zurückschrecken. Auch bei ATL im Ort, ich mag nicht es aus dem einfachen Grunde, dass es nicht natürlich genug aussieht. Having said that, ich habe ein paar Projekte tun ATL verwendet wird.

Damals wurde die Alternative ist die Verwendung VB. VB-Code sieht natürlicher für COM oder DCOM-Programmierung.

Heute würde ich C # verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top