我正在学习C ++,而我正在尝试了解有关使用友情键盘的更多信息。
但是,我在Header文件中使用嵌套类时遇到了麻烦。
我知道头文件只应该用于声明,但我不想在其中包含一个cpp文件,所以我只使用头文件来声明和构建。
Anways,我有一个main.cpp文件,我想严格用它来创建类的对象并访问它的函数。
但是,我不知道如何在我的头文件中创建FriendFunctionTest函数,以便我可以使用头类Class对象在main.cpp源文件中访问它,因为我正在尝试理解“friend”关键字。
这是我的标题代码:
#ifndef FRIENDKEYWORD_H_
#define FRIENDKEYWORD_H_
using namespace std;
class FriendKeyword
{
public:
FriendKeyword()
{//default constructor setting private variable to 0
friendVar = 0;
}
private:
int friendVar;
//keyword "friend" will allow function to access private members
//of FriendKeyword class
//Also using & in front of object to "reference" the object, if
//using the object itself, a copy of the object will be created
//instead of a "reference" to the object, i.e. the object itself
friend void FriendFunctionTest(FriendKeyword &friendObj);
};
void FriendFunctionTest(FriendKeyword &friendObj)
{//accessing the private member in the FriendKeyword class
friendObj.friendVar = 17;
cout << friendObj.friendVar << endl;
}
#endif /* FRIENDKEYWORD_H_ */
在我的main.cpp文件中,我想做类似的事情:
FriendKeyword keyObj1;
FriendKeyword keyObj2;
keyObj1.FriendFunctionTest(keyObj2);
但显然它不起作用,因为main.cpp无法在头文件中找到FriendFunctionTest函数。
如何解决此问题?
我再次道歉,我只是想在线学习C ++。
答案 0 :(得分:1)
friend
关键字仅用于指定函数或其他类是否可以访问该类的私有成员。您不需要类继承或嵌套,因为FriendFunctionTest
是一个全局函数。全局函数在调用时不需要任何类前缀。
friend
的来源:http://msdn.microsoft.com/en-us/library/465sdshe(v=vs.80).aspx
答案 1 :(得分:0)
你真的在谈论几件完全不同的事情。以下是其中两个的示例:
1)“朋友”:
http://www.learncpp.com/cpp-tutorial/813-friend-functions-and-classes/
//类声明 class Accumulator { 私人的: int m_nValue; 上市: 累加器(){m_nValue = 0; } void Add(int nValue){m_nValue + = nValue; }
//使Reset()函数成为此类的朋友 friend void Reset(Accumulator&amp; cAccumulator); };
// Reset()现在是Accumulator类的朋友 void Reset(累加器&amp; cAccumulator) { //并且可以访问Accumulator对象的私有数据 cAccumulator.m_nValue = 0; }
2)“嵌套类”:
答案 2 :(得分:0)
朋友不是会员。以下是在实践中如何使用“朋友”的一个很好的例子。
namespace Bar {
class Foo {
public:
// whatever...
friend void swap(Foo &left, Foo &right); // Declare that the non-member function
// swap has access to private section.
private:
Obj1 o1;
Obj2 o2;
};
void swap(Foo &left, Foo &right) {
std::swap(left.o1, right.o1);
std::swap(left.o2, right.o2);
}
} // end namespace Bar
我们已经声明了一个交换Foo的函数,它比std :: swap更有效,假设类Obj1和Obj2具有高效的移动语义。 (亲爱的,你快速使用绿色复选标记!:))
知道因为交换例程由Foo对象(在这种情况下为两个)参数化并且在与Foo相同的命名空间中声明,它很有用,它成为Foo公共接口的一部分,即使它不是成员。该机制称为“参数依赖查找”(ADL)。