Как я могу использовать личную переменную в классе через функцию (не в любом классе)? - PullRequest
2 голосов
/ 23 мая 2019

Функция имеет 2 аргументов. Один тип - это вектор класса (имеет строковую приватную переменную). Другая строка ищет. Я попробовал == обе строки, но это не сработает. Я ожидал этого, но надеялся, что смогу использовать friend, но он работает только для 2 классов.

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

class Term
{
    string str;
    unsigned long long int weight;
    Term(string s, long int w) : str(s), weight(w) {}
};
//my teacher provided this code so I can't change anything above

int FindFirstMatch(vector<Term> & records, string prefix)
//prefix is the word it looks for and returns the earliest time it appears.
{
    for (int i=0; i<records.size(); i++)
    {
        if (records[i].str==prefix)
        {
//I just need to get this part working
           return i;
        }
    }
}`

В нем говорится, что str является приватным членом Term. Вот почему я надеялся просто использовать на нем friend.

1 Ответ

1 голос
/ 23 мая 2019

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

Кроме friend члена, вы можете предоставить функцию получения, с помощью которой вы сможете получить к нему доступ.

class Term
{
private:
    std::string _str;
    unsigned long long int weight;

public:
    // constructor needs to be public in order to make an instance of the class
    Term(const std::string &s, long int w) : _str(s), weight(w) {}

    // provide a getter for member string
    const std::string& getString() const /* noexcept */ { return _str; }
};

int FindFirstMatch(const std::vector<Term>& records, const std::string &prefix)
{
    for (std::size_t i = 0; i < records.size(); i++)
    {
        if (records[i].getString() == prefix) // now you could access via getString()
        {
            return i;
        }
    }   
    return -1; // default return
}

Или, если вам разрешено использовать стандартные алгоритмы , например, используя std :: find_if и std :: distance .

( См. Live )

#include <iterator>
#include <algorithm>

int FindFirstMatch(const std::vector<Term>& records, const std::string &prefix)
{
    const auto iter = std::find_if(std::cbegin(records), std::cend(records), [&](const Term & term) { return term.getString() == prefix; });
    return iter != std::cend(records) ? std::distance(std::cbegin(records) , iter) : -1;
}
...