2016-08-09 8 views
3

私は主なコマンドライン引数(例えば、-B、-aなど)をとり、それらで何かをするクラスを持っていますが、コマンドライン引数を渡さずにその関数をインスタンス化することもできます例えば:const char **はどのように見えますか?

コンストラクタ:

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

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

ここで私はフラグ "-B" とはMyClassのインスタンスを作成しようとしていますが、それは私にエラーを与え続け:

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

ので、私大変だった私はconst char **で値を渡すために何が必要なのでしょうか?

+3

これは、実際のコード**ではありません**。実際のコードを投稿してください。今のところ、欠けている例として閉じることを投票する。 –

+0

注1: 'main'引数を渡したい場合、' const char ** argv'型は行いません。 'char **'から 'char const **'への暗黙的な変換はありません。 –

+0

注2: 'char'の配列(例えば' -B "'など)はポインタへのポインタにはならない。 –

答えて

-1

const char**const char*へのポインタです。あなたのケースでは、あなたは以下のようなものを渡すことができますので、argvの一環として、複数の引数を渡すつもり:

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

注:const char** x & const char* x[]同じです。 2番目の構文は、配列を "表現する"ときに役立ちます。

ここでは、内部テストのための関数引数であるmain(int, char**)を模倣する方法を示します。デフォルトコンストラクタから引数コンストラクタに渡す場合は、上記のすべてのものをグローバルに渡す必要があります。

+0

注意:あなたの例では、 'argv' *は' const char ** 'ではなく、この違いについては説明しません。 – juanchopanza

+0

質問のコードが実際のコードを正確に表していると考える理由はありません。これは、「このようなもの」の例です。あなたが本当に答えを提供する価値があると思うなら、あなたは、 "主なコマンドライン引数を取る"という目標との非互換性に取り組むべきだと思います。 –

+0

@juanchopanza、そうです。私はその答えを提示しました。OPは、これらの議論を次のプロセスのために自分のクラスに渡そうとしているようです。さらに、 'main()'の 'char ** 'はCのレガシーの理由です(' const'はその時点で存在しませんでした)。その理由は、 'argv'を変更しようとしたことがないので、' const char ** 'を提示しました。 – iammilind

1

第1レベルは、char *への最初のポインタへのポインタです。 2番目のレベルは、最初のconst charのc-stringへのポインタです。

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

あなたは-std = C++利用できる11、あなたはこの例を使用することができます(ただし、古い標準を使用するように書き換えることができます)がある場合:

#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; 

} 
関連する問題