在另一个类中调用类的朋友成员失败

时间:2017-12-26 23:38:40

标签: c++

我认为添加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的情况下修复上述代码?

1 个答案:

答案 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);
}

没有其他解决方案。你必须准确地指明你的需要。