如何通过函数在类中使用私有变量(在任何类中均不如此)?

时间:2019-05-23 03:18:30

标签: c++ class search stdvector friend

一个函数具有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;
        }
    }
}`

它说strTerm的私人成员。这就是为什么我希望在其上简单使用friend的原因。

1 个答案:

答案 0 :(得分:1)

Term类的所有成员都在private的监护下,因此您甚至无法从中创建一个实例。您的老师肯定错过了/或希望您找出答案。

除了friend成员之外,您还可以提供一个getter函数,通过它可以访问它。

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
}

或者如果允许您使用 standard algorithms ,例如使用 std::find_if std::distance

See 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;
}