如何通过函数(不是任何 class)在 class 中使用私有变量?
How do I use a private variable in a class through a function(not in any class)?
一个函数有 2
个参数。一种类型是 class 的 向量(具有字符串私有变量)。另一个是它寻找的字符串。我试过 ==
两个字符串,但它不起作用。我期待它,但希望我可以在它上面使用 friend
,但它似乎只适用于 2
classes.
我尝试在 class Term
上使用 friend
函数进行搜索,但找不到使用一个 class 和一个函数的结果。除了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
就可以了。
Term
class 的所有成员都在 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, for instance using std::find_if and 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;
}
一个函数有 2
个参数。一种类型是 class 的 向量(具有字符串私有变量)。另一个是它寻找的字符串。我试过 ==
两个字符串,但它不起作用。我期待它,但希望我可以在它上面使用 friend
,但它似乎只适用于 2
classes.
我尝试在 class Term
上使用 friend
函数进行搜索,但找不到使用一个 class 和一个函数的结果。除了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
就可以了。
Term
class 的所有成员都在 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, for instance using std::find_if and 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;
}