2016-08-09 16 views
3

Ich habe eine Klasse, die die wichtigsten Befehlszeilenargumente (zB -B, -a, etc) nimmt und etwas mit ihnen macht, aber ich würde auch gerne in der Lage sein, diese Funktion zu instanziieren, ohne die Kommandozeilenargumente zu übergeben zum Beispiel:Wie sieht ein Const Char ** aus?

Konstruktor:

myClass(int argc, const char **argv){ 
    <initialise class with flags from argv> 
} 

myClass() : myClass(2, "-B") {} 
} 

Hier versuche ich myClass mit der Flagge "-B" zu instanziiert, aber es hält mir den Fehler geben:

no known conversion for argument 3 from ‘const char [3]’ to ‘const char**’

so i war wond Was muss ich tun, um einen Wert als const char ** zu übergeben?

+3

Dies ist ** nicht der echten Code **. Bitte poste echten Code. Zum jetzigen Zeitpunkt wählen Sie das Schließen als fehlendes Beispiel. –

+0

Hinweis 1: Wenn Sie die 'main' Argumente übergeben möchten, ist der Typ 'const char ** argv' nicht geeignet. Es gibt keine implizite Umwandlung von 'char **' in 'char const **'. –

+0

Anmerkung 2: Ein Array von 'char' (wie das Literal' "-B" ') zerfällt nicht zu Zeiger zu Zeiger. –

Antwort

-1

const char** ist Zeiger auf const char*. In Ihrem Fall wollen Sie mehrere Argumente als Teil argv, so dass Sie etwas passieren wie unten passieren:

const char* argv[] = {"<program name>", "B"}; 
myClass m(2, argv); 

Hinweis: const char** x & const char* x[] gleich sind. Die zweite Syntax ist hilfreich, wenn man ein Array "repräsentieren" will.

Hier gebe ich eine Möglichkeit, das Funktionsargument main(int, char**) für Ihren internen Test nachzuahmen. Wenn Sie vom Standardkonstruktor zum Argumentkonstruktor übergehen wollen, müssen alle oben genannten Dinge global werden.

+0

Vorsicht: In Ihrem Beispiel ist 'argv' * kein * const char **' und die Note erklärt diesen Unterschied nicht. – juanchopanza

+0

Es besteht kein Grund zu der Annahme, dass der Code in der Frage den echten Code genau wiedergibt. Es ist ein "ähnliches" Beispiel. Das heißt, wenn Sie wirklich denken, dass es sich lohnt, eine Antwort zu geben, dann denke ich, dass Sie die Inkompatibilität mit dem Ziel angehen sollten, "welches die Hauptkommandozeilenargumente nimmt". –

+0

@juanchopanza, das ist richtig, und ich habe das in der Antwort vorgestellt.Es scheint, dass das OP diese Argumente für den weiteren Prozess an die eigene Klasse weitergeben will. Außerdem ist 'char **' in 'main()' für C Legacy-Grund (die 'const' existierte zu dieser Zeit nicht). Aus diesem Grund habe ich 'const char **' präsentiert, weil es niemals beabsichtigt ist, 'argv' zu ändern. – iammilind

1

Erste Ebene ist Zeiger auf ersten Zeiger auf char *. Zweite Ebene ist Zeiger auf die erste const char von C-String.

> cdecl explain "const char ** args" 
declare args as pointer to pointer to const char 

Wenn Sie -std = C++ 11 verfügbar ist, können Sie dieses Beispiel verwenden (aber es neu geschrieben werden kann alten Standard verwenden):

#include <iostream> 
#include <vector> 
#include <string>  

class test { 
    public: 
    test(const std::vector<std::string> & args) { 
     for (auto & arg : args) { 
     std::cout << arg << "\n"; 
     } 
    } 

    test() : test{{"-B"}} {} 
}; 

int main(int argc, const char ** argv) { 
    test sth{{argv+1, argc+argv}}; // skip program name here 
    test sth_else; 

}