Первый класс C ++ и не уверен в некоторых вещах. в частности "const std :: string & prompt - PullRequest
3 голосов
/ 12 января 2020

Это мое первое задание, и я немного растерялся. Предполагается спросить любимый цвет, целое число, затем число с плавающей запятой, а затем вывести цвет и число с плавающей точкой (целое число раз) Я создал несколько файлов, и я считаю, что #include их правильно и тому подобное, но что-то идет не так. Я знал, что это не сработает, я просто пытался заставить его что-то делать, когда я его «делаю», но я не уверен, как двигаться вперед.

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

std::string getString(std::istream& is, std::ostream& os, const std::string& prompt) {
    std::string color;
    os << "What's your favorite color? ";
    is >> color;
    return color;
}

int getInteger(std::istream& is, std::ostream& os, const std::string& prompt) {
    int num;
    os << "What's your favorite number? ";
    is >> num;
    return num;
}

double getDouble(std::istream& is, std::ostream& os, const std::string& prompt) {
    double dec;
    os << "What's your favorite float? ";
    is >> dec;
    return dec;
}

int assignment1(std::istream& is, std::ostream& os){
    getString(is, os);
    getInteger(is, os);
    getDouble(is, os);
    return num;

мой главный

#include "image_menu.h"
#include <iostream>

int main() {
    assignment1(std::cin, std::cout);
    return 0;
}
#ifndef _IMAGE_MENU_H_
#define _IMAGE_MENU_H_
#include <iostream>
std::string getString( std::istream& is, std::ostream& os, const std::string& prompt );
int getInteger( std::istream& is, std::ostream& os, const std::string& prompt );
double getDouble( std::istream& is, std::ostream& os, const std::string& prompt );
int assignment1( std::istream& is, std::ostream& os );
#endif // _IMAGE_MENU_H_

и мой Makefile

all: assignment

assignment: ppm_menu.o image_menu.o
    g++ -std=c++11 -o assignment ppm_menu.o image_menu.o

ppm_menu.o: ppm_menu.cpp image_menu.h
    g++ -std=c++11 -c ppm_menu.cpp

image_menu.o: image_menu.cpp image_menu.h
    g++ -std=c++11 -c image_menu.cpp

Я знаю, что нужно много, чтобы вы, ребята, просмотрели его. Я не прошу вас сделать мою домашнюю работу для меня, просто чтобы помочь мне понять вещи const std::string& prompt. У меня достаточно базового понимания, я думаю, чтобы выполнить задание, я просто не знаю, что делать с этим параметром. (Нам дали имя функции и параметры учителя, кроме того, что мы сами по себе)

Огромное спасибо за любую помощь!

Инструкции для файла, который я имею проблемы с

std::string getString( std::istream& is, std::ostream& os, const std::string& prompt ); This function must display the prompt to the output stream, read a string response from the input stream and return the string.
int getInteger( std::istream& is, std::ostream& os, const std::string& prompt ); This function must display the prompt to the output stream, read an integer response from the input stream and return the integer.
double getDouble( std::istream& is, std::ostream& os, const std::string& prompt ); This function must display the prompt to the output stream, read a double precision floating point response from the input stream and return the double.
int assignment1( std::istream& is, std::ostream& os ); This function must get a string from the input stream, using the prompt “What’s your favorite color? “, an integer using the prompt “What’s your favorite integer? “, and a double precision floating point number using the prompt “What’s your favorite number? “. It must then repeatedly send the line described above in the assignment description to the output stream. Returns the integer number given by the user.

Ответы [ 3 ]

3 голосов
/ 12 января 2020

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

getString(is, os);

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

getString(is, os, "");

Поскольку существует неявный конструктор, принимающий char const* для std::string, будет создан временный объект, который будет быть уничтоженным снова сразу после завершения вышеупомянутого выражения (т.е. после возврата функции).

Пока что технические вещи. Тем не менее, вас могут попросить разные строки в дальнейших задачах. Что-то вроде имени, верного имени, города, в котором вы живете, ... Хотите написать отдельные функции для всех этих? Здесь появляется подсказка: укажите фактический вопрос, который вы хотите задать, в качестве подсказки. Тогда getString может выглядеть так:

std::string getString(std::istream& is, std::ostream& os, const std::string& prompt)
{
    std::string color; // perhaps rather name it 'value', you won't be asking
                       // for colors all the time...
    os << prompt << ' ';
    is >> color;
    return color;
}

И вы можете назвать его так:

getString(is, os, "What's your favorite color?");

Аналогично другим функциям.


Примечание (после редактирования вопроса): Это действительно то, что действительно требуется для задачи ...

2 голосов
/ 12 января 2020

Давайте разберем, что такое const std::string&

const - это идентификатор в c ++, который ставится перед типом, чтобы показать, что тип не может быть изменен после инициализации.

Для пример, следующий код не скомпилирует const int x = 5; x = 10;

Однако это произойдет.

 int x = 5;
 x = 10

std::string - это класс, представляющий массив символов.

& называется ссылкой , Ссылка имеет семантику, аналогичную указателю, но пока не беспокойтесь об этом.

Давайте рассмотрим вашу первую функцию.

std::string getString( std::istream& is, std::ostream& os, const std::string& prompt );

Требуется 3 аргумента, ссылка на входной поток, использует оператор >>, ссылку на выходной поток, который использует оператор <<, и std :: string.

Это, вероятно, выглядит знакомым.

std::cout << "Hello World!" << std::endl;

Он печатает строку "Привет мир!" на стандартный вывод std :: cout имеет тот же тип, что и вторая переменная во всех ваших функциях, а именно: os.

Первая проблема заключается в том, как вы ее называете.

getString(is, os);

You ' передаем два, но ожидаем три!

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

getString(is, os);

становится

getString(is, os, "what is your favorite string");

Тогда в определении вашей функции для getString вы не хотите жестко кодировать эту строку. Вы хотите использовать все, что пропускает звонящий! то есть

std::string getString(std::istream& is, std::ostream& os, const std::string& prompt)
{
    std::string color;
    os << prompt;
    is >> color;
    return color;
}

Бонусные баллы - Поскольку вы были смущены const std::string&, давайте разберем это немного дальше.

Если наша функция выглядела так,

std :: string getString (std :: istream & is, std :: ostream & os, std :: string & prompt);

и мы определили его как

std::string getString(std::istream& is, std::ostream& os, std::string& prompt)
{   
    std::string color;
    os << prompt;
    is >> color;
    prompt = "What is your favorite dog?";
    return color;
}

Как вы думаете, что произойдет если мы вызвали эту функцию дважды, как,

getString(is, os, "What is your favorite color?");
getString(is, os, "What is your favorite color?");
1 голос
/ 12 января 2020

Понял это благодаря некоторой потрясающей помощи! Большое спасибо всем за помощь!

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

std::string getString(std::istream& is, std::ostream& os, const std::string& prompt) {
    std::string color;
    os << prompt;
    is >> color;
    return color;
}

int getInteger(std::istream& is, std::ostream& os, const std::string& prompt) {
    int num;
    os << prompt;
    is >> num;
    return num;
}

double getDouble(std::istream& is, std::ostream& os, const std::string& prompt) {
    double dec;
    os << prompt;
    is >> dec;
    return dec;
}

int assignment1(std::istream& is, std::ostream& os){
    std::string color = getString(is, os, "What is your favorite color? ");
    int num = getInteger(is, os, "What is your favorite number? ");
    double dec = getDouble(is, os, "What is your favorite double? ");
    for(int a=0; a <= num; a = a +1) {
        os << num << " " << color << " " << dec << "\n";
    }
    return num;
}

Вот как выглядит мой готовый код! Может быть, не красиво, но это работает!

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