2016-08-09 3 views
3

У меня есть класс, который принимает основные аргументы командной строки (например, -B, -a и т. Д.) И что-то делает с ними, но также хотел бы иметь возможность создавать экземпляр этой функции, не передавая аргументы командной строки, поэтому например:Как выглядит const char **?

конструктор:

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

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

Здесь я пытаюсь создать экземпляр MyClass с флагом "-B", но он продолжает давать мне ошибку:

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[] одинаковы. Второй синтаксис полезен, когда нужно «представлять» массив.

Здесь я даю способ имитировать аргумент функции main(int, char**) для вашего внутреннего теста. Если вы хотите перейти от конструктора по умолчанию к конструктору аргументов, то все перечисленные выше вещи должны будут идти глобальными.

+0

Осторожно: в вашем примере 'argv' * не является *' const char ** ', и примечание не объясняет эту разницу. – juanchopanza

+0

Нет причин полагать, что код в вопросе точно представляет реальный код. Это пример «вроде этого». Тем не менее, если вы действительно думаете, что стоит дать ответ, тогда я думаю, что вы должны рассмотреть несовместимость с целью «которая принимает основные аргументы командной строки». –

+0

@juanchopanza, это правильно, и я представил это в ответе.Похоже, что OP хочет передать эти аргументы собственному классу для дальнейшего процесса. Более того, 'char **' в 'main()' является для наследства C (в то время 'const не существовало). Вот почему я представил 'const char **', потому что он никогда не собирался менять 'argv'. – iammilind

1

Первый уровень является указателем на первый указатель на char *. Второй уровень - указатель на первый const char c-строки.

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

} 
Смежные вопросы