2014-06-13 18 views
7

Ich baue eine Bibliothek in C++ (meistens zum Spaß), an der ich schon eine Weile arbeite (Jahre, haha Es ist nur ein Hobby)Erstellen einer Const-Korrekten (C++) Bibliothek, die auf einer nicht-Konst-Correct-Bibliothek basiert

Ich habe kürzlich einige der Grundlagen (lesen, Bibliothek Abhängigkeit) in eine andere Bibliothek. Leider handelt es sich bei dieser Bibliothek nicht um "const-correctness". Ich bin ein bisschen OCD und ich mag es mich selbst herauszufordern Dinge zu tun "The Right Way ™", also möchte ich meine Bibliothek const-correct machen. Ich habe das ein paar Mal begonnen, und einige Teile sind; Ich weiß, dass es besser ist, const-correct von Anfang an zu starten, aber das ist nicht wirklich relevant oder zur Debatte. Tatsache ist, dass ich daran interessiert bin, es wieder ernst zu machen, aber die andere Bibliothek hindert mich daran.

Hows das, könnten Sie fragen?

Nun, wenn ich eine Methode aufrufen, die eindeutig const sein sollte (ändert eigentlich nichts), und meine Methode ist auch ein Kandidat für const-ing (neues Wort), kann ich const-ness auf meinem nicht sicherstellen Methode, bis diese andere Methode auch const ist.

Beispiel:

// Bad third-party library 

struct Foo 
{ 
    void should_be_const() {} 
}; 

// My library 

struct Bar 
{ 
    Foo my_foo; 
    void should_be_const() const 
    { 
     my_foo.should_be_const(); // ERROR! Not a const function! 
    } 
}; 

Dies ist nur ein scheinbar mich aus empirischen Daten und aus meiner Forschung und Verständnis über const-ness. Allerdings könnte dies ein falsch gebildetes Verständnis sein, so dass ich offen bin (und hoffnungsvoll?), Dass es falsch ist und anders gezeigt wird (obwohl das die Grundlage meines Verständnisses von const-ness erschüttern würde)

Was ist eine arme Seele zu tun, wenn er (oder sie) eine richtige Bibliothek schreiben möchte, aber eine Abhängigkeit ist nicht so geschrieben?

Ich hoffe, das ist eine angemessene Frage für SO. Bitte (ich bin mir sicher, dass du es willst) lass es mich wissen, wenn es nicht ist oder es eine bessere StackExchange-Seite gibt, auf der es gepostet werden kann.

P.S. Ich habe this SO question gefunden, aber ich hatte gehofft, dass das Thema/die Lösung ausgearbeitet werden könnte.

+0

Bitte zeigen Sie etwas Code, wie ein Beispiel einer schlecht entworfenen Bibliotheksfunktion von Drittanbietern, und wie Ihre Bibliothek die Klasse dieser Bibliothek verwendet. – aschepler

+9

Wenn ich Sie richtig verstehe, Dies ist ein Grund für "const_cast". Wenn Sie sicher sind, dass eine Funktion wirklich nichts verändert (aber "veränderliche" Datenelemente), oder wenn Sie wissen, dass ein Objekt nicht als const definiert wurde, können Sie das Objekt wegwerfen constness Ja, 'const_cast' steckt ein Loch in das Typsystem, also benutze es vorsichtig – dyp

+0

@dyp das ist mein Verständnis von' const_cast' auch, aber wie du es sagst i führt die Notwendigkeit ein, die Erklärung von ... vielen Dingen zu überwachen? Alles? Es klingt wie ein Albtraum, den es zu erhalten gilt, und es würde immer noch keine Situationen lösen, in denen Objekte als "const" definiert sind. Würdest du zustimmen? –

Antwort

2

Die andere Frage, auf die Sie verwiesen haben, gibt einen ziemlich guten Überblick darüber, was die Probleme sind, aber ich werde der Antwort ein wenig widersprechen. Die Schnittstellen in Ihren Unterbibliotheken werden in vier Fälle aufgeteilt.

  1. Dinge, die nicht konstant sind und nicht erwartet werden können.
  2. Dinge richtig erklärt const
  3. Dinge, die logisch const sein sollte, und

    3a. Sind als solche implementiert, aber nicht deklariert

    3b. Nicht umgesetzt werden als solche

Fall 1 ist einfach - wenn Sie Ihr wollen const sein, dann müssen Sie eine Kopie der Eingabe vornehmen, bevor diese Schnittstelle aufrufen. Eine Besetzung wäre einfach falsch und würde schließlich zu einem Absturz oder anderen Fehler führen. Fall 2 ist kein Problem. Also Fälle 3 ist es.

Unglücklicherweise müssen die Fälle 3a und 3b identisch mit Fall 1 behandelt werden, da sie nicht unterscheidbar sind. Die Implementierung könnte sich je nach Plattform oder Version ändern. Sie sollten also eine Kopie erstellen und dann die Schnittstelle aufrufen. Beachten Sie, ich sagte "sollte."Die Realität ist, dass die meisten von uns einen const_cast verwenden, um Schnittstellen zu nennen, die wir zu verstehen glauben (zB strcmp). Es wird zu einem Urteil darüber, wie zuversichtlich wir in der Implementierung sind. Persönlich würde ich mich über strcmp nicht sorgen etwas höheres Niveau könnte etwas wie strtok verwenden, das Dinge bricht.