2012-03-05 3 views
0

Это может быть вопрос новичков, но я не могу решить эту проблему. Я могу решить одну или последнюю проблему отдельно, но не в одно и то же время.Передача строкового литерала для функции и назначение переменной-члену

У меня есть класс со строковым элементом и функция его установки. Я хочу передать литерал в функцию.

class Profiler 
{ 
private: 
    std::string description; 
    //snip 

public: 
    //snip 
    void startJob(const std::string &desc); 
}; 

void Profiler::startJob(const string &desc) { 
    //snip 
    description = desc; 
} 

и я хочу (На самом деле нужно), чтобы использовать его как это:

profiler.startJob("2 preprocess: 1 cvConvertScale"); 

Проблемы:

  • Как передать строковый литерал к функции? Ответы, которые я мог найти: передать по значению или передать его указателем const или ссылкой на const. Я не хочу передавать его по значению, потому что он медленный (в конце концов, это профилировщик, с точностью до микросекунд). Const pointer/reference дает ошибку компилятора (или я что-то не так?)

  • Как назначить его функции-член? Единственное решение, которое я смог найти, это сделать переменную-член указателем. Предоставление ему указателей, не содержащих указателей, «поле« описание »имеет« неполный тип »(wtf означает ли это?). Наличие его в качестве указателя не работает, потому что он присваивает константу неконстантной. Кажется, работает только указатель/ссылка на const.

+0

Две вещи: 1. Для справки вам нужна действительная переменная. Итак, 'string arg =" 2 preprocess: 1 cvConvertScale "; profiler.startJob (arg); '2. Вы неправильно назначили свой указатель. 'description = &desc;' – chris

ответ

1

Проход по ссылке, магазин по значению, включает в себя заголовок:

#include <string> 

class Profiler 
{ 
    private: 
    std::string description; 
    //snip 

public: 
    //snip 
    void startJob(const std::string &desc); 
}; 

void Profiler::startJob(const string &desc) { 
    //snip 
    description = desc; 
} 

Сохранение значения является Годится если вы не изменяете исходную строку. Если вы этого не сделаете, они обменяются памятью, и не будет неэффективной копии. В этом случае вы получите символы, скопированные в буфер, управляемый std :: string.

Я не думаю, что можно сохранить указатель на литерал-char * в качестве экземпляра std :: string, хотя это будет o.k. для сохранения указателя char *.

+0

Использование 'std :: string description;' дает вышеупомянутое сообщение об ошибке 'description' имеет неполный тип'. И я * хочу, чтобы они делили память, строки буквальны и никогда не меняются. –

+0

Я использовал для передачи и хранения по 'char *', но это работало только в MSVC, в MinGW я получаю ошибку, которую он хочет преобразовать из const char * в char * (почему MSVC не дает этой ошибки, является загадкой для меня) –

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