Überspringen von Standardargumenten C ++?

10

Ich muss einen Konstruktor mit zwei Standardparametern schreiben.

%Vor%

Ich habe das Szenario angegeben, in dem der Konstruktor aufgerufen wird und ein Wert für arg1 und arg2 angegeben wird und arg3 wird voraussichtlich einen Standardwert verwenden. Dann wird ein anderes Objekt instanziiert und ein Wert wird an arg1 und arg3 vergeben, und es wird erwartet, dass der Standardwert für arg2 verwendet wird.     Jetzt ist das Problem, Sie können "Standardparameter nicht überspringen" ist, was ich vom Text und online lese. Es wird gesagt, die Standardparameter von ihrer Überladenheit zu ordnen, aber das Szenario hat einen Standardparameter, während der andere nicht verwendet wird. Die Hinweise für diese Frage sagen mir, dass ich die Parameter / Argumente neu anordnen soll. Es scheint jedoch, dass keine der von mir durchgeführten Nachbestellungen in der Lage ist, dieses Problem zu lösen.

Außerdem können überladene Konstruktoren nicht verwendet werden. Dies muss von einem Konstruktor durchgeführt werden.

Wie würde man das machen? Ich bin ratlos und werde ein bisschen verrückt darüber :(

    
user1034846 24.11.2011, 22:03
quelle

4 Antworten

7
  

Außerdem können überladene Konstruktoren nicht verwendet werden. Dies muss von einem Konstruktor durchgeführt werden.

Der einzige Grund, warum ich mir diese Anforderung vorstellen kann, ist, dass die optionalen Argumente denselben Typ haben. In diesem Fall stecken Sie fest und Sie möchten in den benannten Konstruktor und / schauen. oder benannte Parameter Idiome.

Ansonsten definieren Sie einfach den zusätzlichen Konstruktor. Dies kann zu einer gewissen Duplizierung führen. die Standardwerte.

%Vor%     
Fred Foo 24.11.2011 22:09
quelle
1

Wenn Sie eine leere C-Zeichenfolge übergeben können, wenn Sie keinen Wert für den zweiten Parameter haben, können Sie einen Helfer-Funktor verwenden, der arg2 überprüft und den Standardwert zurückgibt, wenn er leer ist. Etwas wie das:

%Vor%

Nicht hübsch, ich weiß ...

    
jrok 24.11.2011 23:10
quelle
1

Besondere Einschränkung, dass es nur einen Konstruktor geben muss. Hier ist das nächste, was mir einfällt:

%Vor%

Beachten Sie, dass bei GCC Warnungen generiert werden, da die Konvertierung von einem String-Literal in nicht-const char* veraltet und unklug ist. Aber es ist, was Sie gefragt haben, und es so zu beheben, dass die Parameter char* und Datenelement const char* einfach genug sind.

Eine wesentliche Schwäche ist, dass Sie damit nicht aufhören, Foo(1,2,3) zu schreiben. Um zu überprüfen, dass zur Kompilierzeit denke ich, dass Sie mehrere Konstruktoren benötigen. Um es zur Laufzeit zu überprüfen, könnten Sie den dritten Parameter in eine andere Klasse stellen, DefaultOrInt , wobei Default ein Typ ist, der nur für diesen Zweck verwendet wird und nur einen Wert unterstützt, der als Standardwert von arg3 verwendet wird. Dann, wenn arg2.isInt() wahr ist, überprüfen Sie arg3.isInt() ist falsch und wenn nicht logic_error werfen.

    
Steve Jessop 24.11.2011 22:59
quelle
1

Im Moment können Sie std :: bind verwenden, um diese Art von Operation oder in c ++ 14/17 Sie können die Lambda-Funktion verwenden und das gleiche erreichen.

    
M.Baryłowicz 10.01.2018 09:00
quelle

Tags und Links