2016-12-16 2 views
1

Я пытаюсь создать базовый пользовательский интерфейс, который не учитывает регистр для удобства. Для этого я сделал класс конвертера, который делает строку в верхнем регистре, но я наткнулся на проблему. После использования класса оператор if в main() должен интерпретировать сообщение из конвертера, но он только считывает исходный вход, а не заглавный, и я попытался вернуть преобразованную строку непосредственно из конвертер, но это не позволит мне.Возврат строковой переменной в C++

#include "stdafx.h" 
#include <iostream> 
#include <string> 

using namespace std; 

string response; 

//converts responses to upper-case 
void convert(string response) { 
    for (int i = 0; i < response.length(); i++) { 
     response[i] = toupper(response[i]); 
    } 
} 

//main dialogue 
int main() { 

    cout << "How are you?: "; 
    getline(cin, response); 
    convert(response); 
    if (response == "GOOD") { 
     cout << "Response 1./l"; 
    } 
     else { 
     cout << "Response 2./l"; 
    } 
} 

Я новичок в C++, поэтому я прошу прощения, если ошибка была легкой, чтобы исправить или, если у меня есть трудности в понимании решения.

ответ

1

Другой вариант - изменить заголовок функции так, чтобы он возвращал номер string. То есть:

string convert(const string &inResponse) { 
    string outResponse(inResponse); 
    for (int i = 0; i < inResponse.length(); i++) { 
     outResponse[i] = toupper(inResponse[i]); 
    } 
    return outResponse; 
} 

И затем использовать возвращенную строку в основной функции, как:

.... 
// response is input, outputResponse is output: 
string outputResponse = convert(response); 
.... 
+0

@ John3136 Хороший вопрос об избежании копирования, когда это возможно. – NoseKnowsAll

+0

Я не знал, что классы могут быть идентифицированы как строки, которые, вероятно, устранили бы мою проблему. В конце я положил getline (cin, response); в самом конвертере и просто называли конвертер всякий раз, когда мне нужен был ответ. – Zyxlm

+1

«Я не знал, что классы могут быть идентифицированы как строки» Что это значит? И теперь у вас есть вход в сочетании с модификацией - это плохая разработка программного обеспечения. Здесь представлено несколько вариантов хороших рабочих решений, но вы игнорируете их всех? – John3136

2

Посмотрите «пройти по значению» и «пройти по ссылке» - у вас есть «пройти по значению», но вы ожидаете «пройти по ссылке»

В C++: void convert(string& response) {

В вашем случае, если вещи немного «нечетные», потому что, как указано в комментариях @NeilLocketz, у вас есть глобальный response, локальный response в методе, который на самом деле является глобальным, поскольку вы используете это как вызывающий параметр. Если вы хотите сделать что-то правильно, вы, вероятно, не хотите, чтобы response был глобальным.

Обратите внимание, что принятый ответ по-прежнему содержит больше копий памяти, чем этот. Настоящий ключ состоит в том, чтобы понимать пропуск по значению и передавать по ссылке и использовать то, что подходит для ваших обстоятельств.

+1

он также затенял глобальный отклик –

+0

@NeilLocketz Очень хороший момент (я полностью пропустил ;-) – John3136

2

Помимо необходимости передать ссылку вместо значения, вы должны попробовать использовать C++ - 11:

void convert(string &response) { 
    for (auto &c: response) { 
     c = toupper(c); 
    } 
} 

это намного чище и проще.

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