Подтвердить что ты не робот

С++ Pass A String

Быстрый, вероятно, очевидный вопрос.

Если у меня есть:

void print(string input)
{
  cout << input << endl;
}

Как мне это назвать:

print("Yo!");

Он жалуется, что я перехожу в char * вместо std::string. Есть ли способ привести его в вызов? Вместо:

string send = "Yo!";
print(send);

Спасибо.

4b9b3361

Ответ 1

Вы можете написать свою функцию, чтобы взять const std::string&:

void print(const std::string& input)
{
    cout << input << endl;
}

или a const char*:

void print(const char* input)
{
    cout << input << endl;
}

Оба способа позволяют называть его следующим образом:

print("Hello World!\n"); // A temporary is made
std::string someString = //...
print(someString); // No temporary is made

Вторая версия требует c_str() для вызова std::string s:

print("Hello World!\n"); // No temporary is made
std::string someString = //...
print(someString.c_str()); // No temporary is made

Ответ 2

Вы должны иметь возможность вызывать print ( "yo!" ), так как существует конструктор для std::string, который принимает const char *. Эти одиночные конструкторы аргументов определяют неявные преобразования из их агитов в их тип класса (если конструктор не объявлен явно, что не относится к std::string). Вы действительно пытались скомпилировать этот код?

void print(std::string input)
{
    cout << input << endl;
} 
int main()
{
    print("yo");
}

Он компилируется для меня в GCC. Однако, если вы объявили print следующим образом void print(std::string& input), тогда он не сможет скомпилироваться, так как вы не можете привязать неконстантную ссылку на временную (строка будет временной, построенной из "yo" )

Ответ 3

print(string ("Yo!"));

Вам нужно сделать из него (временный) std::string объект.

Ответ 4

Очевидным способом было бы вызвать функцию, подобную этой

print(string("Yo!"));

Ответ 5

Ну, std::string - это класс, const char * - это указатель. Это две разные вещи. Легко получить от string указатель (поскольку он обычно содержит тот, который он может просто вернуть), но для другого пути вам нужно создать объект типа std::string.

Моя рекомендация. Функции, которые принимают постоянные строки и не изменяют их, всегда должны принимать const char * в качестве аргумента. Таким образом, они всегда будут работать - со строковыми литералами, а также с std::string (через неявный c_str()).

Ответ 6

Сделайте так, чтобы ваша функция принимала const std::string& вместо значения. Это не только предотвращает копирование и поэтому всегда предпочтительнее принимать строки в функции, но также позволяет компилятору создать временный std::string из char[], который вы ему даете.:)

Ответ 7

Просто введите его как const char *. print ((const char *) "Yo!" ) будет работать нормально.