Проблема компиляции при передаче строковой переменной в функцию вместо фиксированного массива символов - PullRequest
1 голос
/ 03 декабря 2011

Я использую метод списка инициализатора для моего конструктора класса.Я инициализирую свои переменные, вызывая функцию-член getData класса dataRegistry, которая предоставляет данные для загрузки в переменные моего класса.Метод getData обычно вызывается путем передачи массива символов, который содержит имя данных для загрузки.

Например, список инициализаторов выглядит следующим образом:

    dataItem1(dr.getData("Pop.Stats1")),
    dataItem2(dr.getData("Pop.Stats2"))

Однако из-зав соответствии с именами предоставленных мне нужно извлечь имя набора данных из пользовательского класса, а затем добавить имя переменной для передачи в метод getData.Примерно так:

    datasetName(user.getAttributeString("DataSetName")),
    dataItem1(dr.getData(datasetName + ".Stats1")),
    dataItem2(dr.getData(datasetName + ".Stats2"))

, где datasetName определено как переменная std :: string.

Однако это приводит к следующей ошибке:

     no matching function for call to 'DataRegistry::GetData(std::basic_string<char,std::char_traits<char>, std::allocator<char> >)'

Так какРеализация метода getData мне не предоставлена, и я знаю, что он работает, когда я просто передаю массив функций (например, «Pop.Stat1») в функцию, я подозревал, что это произошло потому, что функция принимала только символьные массивы.Итак, я попытался:

    datasetName(user.getAttributeString("DataSetName")),
    dataItem1(dr.getData(strcat(datasetName.c_str() , ".Stats1"))),
    dataItem2(dr.getData(strcat(datasetName.c_str() , ".Stats2"))),

но это выдает ошибку:

    error: invalid conversion from 'const char*' to 'char*'
    initializing argument 1 of 'char* strcat(char*, const char*)'

Я не знаю, что происходит не так?Пожалуйста, сообщите!

Ответы [ 4 ]

4 голосов
/ 03 декабря 2011

Почти, хотя использование strcat для возвращаемого значения c_str() вызывает неопределенное поведение.Просто сделайте:

(datasetName + ".Stats1").c_str()

, чтобы вся строка выглядела как

dataItem1(dr.getData((datasetName + ".Stats1").c_str())),

Поскольку вы объединяете ".Stats1" с datasetName через string::operator+, то вы хотите получитьconst char* к этой строке, поэтому вы используете c_str() для возвращаемого значения operator+.

Вам нужно заключить в скобки, потому что . имеет более высокий приоритет, чем +, так что если в скобкахне было бы, вы бы звонили c_str() на ".Stats1" (вместо возвращаемого значения +), которого не существует.

1 голос
/ 03 декабря 2011

Если datasetName - std::string, то тип datasetName + "str" также std::string, поэтому вам нужно c_str (), чтобы получить const char*.

dataItem1(dr.getData( (datasetName + ".Stats1").c_str() )),
dataItem2(dr.getData( (datasetName + ".Stats2").c_str() )

Однако сразу после getData возвращает, значение (datasetName + ".Stats1").c_str() освобождается, поэтому убедитесь, что getData копирует содержимое массива char.

1 голос
/ 03 декабря 2011

datasetName.c_str() возвращает const char * - как, вы не можете изменить его - это указатель на внутренние данные std::string

Более того ... даже если это просто char *, вы не можете просто добавить данные в конец и назвать их хорошими - у вас нет выделенной памяти для этого.

Добавить к std::string и , затем , позвонить c_str()

0 голосов
/ 03 декабря 2011

Сообщение об ошибке ясно. Метод c_str возвращает const char *, но первым параметром strcat является char *.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...