我认为添加friend
会使一个函数在另一个类的成员函数中可见并可访问,但它失败了。这是一个显示方案的最小工作示例
#include <iostream>
#include <string>
class A {
public:
A() { }
void print(std::string str);
};
class B {
public:
B() { }
friend void A::print(std::string);
void set(std::string str);
};
void A::print(std::string str)
{
std::cout << str << std::endl;
}
void B::set(std::string str)
{
A::print(str); // <-- error: ‘print’ was not declared in this scope
}
int main(int argc, char *argv[])
{
B b;
b.set("hello");
return 0;
}
我发现的大多数例子都将A类的对象作为B类成员函数的参数传递给我,但我找不到与我的问题类似的东西。如何在不使用static
的情况下修复上述代码?
答案 0 :(得分:3)
friend
表示特定功能或class
/ struct
具有private
可见性。这意味着,它可以完全访问您的所有成员。在你的情况下,这并没有多大作用,但绝不应该没有充分的理由。
我认为,您所寻找的是static
关键字。
#include <iostream>
#include <string>
class A {
public:
A() { }
static void print(std::string str);
};
class B {
public:
B() { }
void set(std::string str);
};
void A::print(std::string str)
{
std::cout << str << std::endl;
}
void B::set(std::string str)
{
A::print(str); // <-- error: ‘print’ was not declared in this scope
}
int main(int argc, char *argv[])
{
B b;
b.set("hello");
return 0;
}
编辑:没有看到,问题是没有使用静态。我不知道,在这种情况下,静态是否有问题,但你可以将print声明为自由函数,或者创建A的实例并以这种方式调用print。
void B::set(std::string str)
{
A a;
a.print(str);
}
没有其他解决方案。你必须准确地指明你的需要。