Как получить функцию с другим типом возврата?C ++ - PullRequest
0 голосов
/ 03 декабря 2018

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

Вот задача, которая является частью задания.Если бы вы могли объяснить свое решение так, чтобы такой тупой человек, как я, мог понять его, это было бы очень полезно.

FindWord - эта функция-член будет принимать строку в качестве параметра и искать еев списке.Если список пуст или его нельзя найти, он возвращает пустое строковое значение («»).В противном случае он возвращает значение индекса int (например, номер элемента массива, например 0, 1, 2 и т. Д.).Помните, что оператор сравнения == работает со строками, которые обрабатываются как строковые объекты (а не элементы данных char), и вам не нужно учитывать регистр.

РЕДАКТИРОВАТЬ: Вот мой коддалеко

int WordList::FindWord(string word){

if ((listSize = 0)){ // return -1 if no list exists;
    return -1;
}
else {
    for (int i =0;i<listSize;i++){ // run loop to check for word/        
        if (word == list[i]) // if word is found then return index
            return i;
     }        
        return -1; // return -1 if word is not found
   }
}

Ответы [ 5 ]

0 голосов
/ 05 декабря 2018

Я увидел ответ, предлагающий вернуть структуру.Как насчет объединения с целочисленными и строковыми значениями и размещения его в качестве возвращаемого типа

0 голосов
/ 03 декабря 2018

вы можете вернуть void *, он вернет все, что вы хотите

0 голосов
/ 03 декабря 2018

Это невозможно в C ++. Для функции может быть определен только один тип возврата.

Здесь возможны 2 сценария:

1 Возвращает структуру, содержащую как целое число, так и строкуи использование того, который установлен

EG

struct returnData{
int returnCode;
std::string returnText;
}

returnData myFunc(std::string){}

2, будет потенциально использовать вашу строку поиска в качестве параметра входа / выхода, но это имеет даже меньше смысла, чем назначение, поэтому я выиграл 'не вдавайтесь в подробности.

Существует также возможность вернуть void * (общий фрагмент данных) и затем преобразовать его в строку или int, но не будет никакого способа узнать, каким он должен быть.

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

0 голосов
/ 03 декабря 2018

Это можно сделать с помощью функций C ++ 17 std::variant и std::get_if.

  • Функция поиска вернет std::variant<int, std::string>
  • In main use std::get_if, чтобы определить, какое из значений было возвращено.

std::get_if возвращает указатель на значение, сохраненное в указанном варианте, или нулевой указатель при ошибке.

#include <variant>
#include <string>
#include <iostream>
#include <list>

 std::variant<int, std::string> strSearch(const std::string& searchStr, const std::list<std::string>& searchList)
 {
     int i = 0;
     for(const auto& s: searchList) {               
        if(!s.find(searchStr))
            return i;
        i++;    
     }
     return "";     
 }

int main()
{
    std::list<std::string> strList = {"stack", "stackover", "stackoverflow"};
    std::string str = "stackoverflow";
    std::variant<int, std::string> v{strSearch(str, strList)};
    if(std::get_if<int>(&v))
        std::cout << "String found. Index in the List is:" << std::get<int>(v) << '\n';
    else    
        std::cout << "String not found"  << '\n';

    str = "stackunderflow";
    v = strSearch(str, strList);
    if(std::get_if<int>(&v))
        std::cout << "String found. Index in the List is:" << std::get<int>(v)  << '\n';
    else    
        std::cout << "String not found."  << '\n';    

}

Смотрите это вживую здесь .

0 голосов
/ 03 декабря 2018

Вам необходимо вернуть два объекта, и вы не можете сделать это, перегрузив функцию.

Таким образом, вы можете использовать:

std::pair<int, std::string> search(const std::string&, const std::list<std::string>& l);

Или вы можете вернуть второй объект, передавссылка на него:

std::string search(const std::string&, const std::list<std::string>& l, it& index);

Другой вариант в C ++ 17 - это правильный способ сделать это:

std::optional<size_t> search(const std::string&, const std::list<std::string>& l);

Вы получите целое число, если поиск был успешным, иначе вы нене получить значение.Возвращать пустую строку просто ...

...