Передача строкового литерала в функцию и присваивание переменной-члену - PullRequest
0 голосов
/ 05 марта 2012

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

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

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 указатель / ссылка дают ошибку компилятора (или я делаю что-то не так?)

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

1 Ответ

1 голос
/ 05 марта 2012

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

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

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

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