none
为何友元无法访问私有成员 RRS feed

  • 问题

  • 我用的是Visual C++ 2008 Express Edition
    我定义了两个类分别在Cat.h 和 Prectice_3.h
    Cat.h
    ===========================
    namespace Prectice_3{

     class Cat;
    ref class Prectice;};


    namespace Prectice_3{
     public class Cat
     {
      
     public:
      Cat(void);
      ~Cat(void);

    friend void  showN(Prectice_3::Cat &obj1);
    //已经声明了友元

      friend Prectice_3::Mouse ;
      
     private:
      char *name;
      int age;
      double weight;

     };
    };
    ==============================
    Prectice_3.h
    ==============================
    #include "Cat.h"

    namespace Prectice_3
    {

    ref class Prectice
    {
    public:
    Prectice(void);
    ~Prectice(void);
    int Run(void);
    void showN(Prectice_3::Cat &obj1)
    {
     System::Console::Write ("Cat:\n");
     cout<<"\tName:\t"<<obj1.name  <<endl;
    cout<<"\tAge:\t"<<obj1.age  <<endl;
    cout<<"\tWeight:\t"<<obj1.weight   <<endl;
    }
    };
    };
    可是在编译时却提示
    1>.\Prectice_3.cpp(13) : error C2248: “Prectice_3::Cat::name”: 无法访问 private 成员(在“Prectice_3::Cat”类中声明)
    1>        d:\documents\visual studio 2008\projects\prectice_3\prectice_3\Cat.h(21) : 参见“Prectice_3::Cat::name”的声明
    1>        d:\documents\visual studio 2008\projects\prectice_3\prectice_3\Cat.h(11) : 参见“Prectice_3::Cat”的声明
    1>.\Prectice_3.cpp(14) : error C2248: “Prectice_3::Cat::age”: 无法访问 private 成员(在“Prectice_3::Cat”类中声明)
    1>        d:\documents\visual studio 2008\projects\prectice_3\prectice_3\Cat.h(22) : 参见“Prectice_3::Cat::age”的声明
    1>        d:\documents\visual studio 2008\projects\prectice_3\prectice_3\Cat.h(11) : 参见“Prectice_3::Cat”的声明
    1>.\Prectice_3.cpp(15) : error C2248: “Prectice_3::Cat::weight”: 无法访问 private 成员(在“Prectice_3::Cat”类中声明)
    1>        d:\documents\visual studio 2008\projects\prectice_3\prectice_3\Cat.h(23) : 参见“Prectice_3::Cat::weight”的声明
    1>        d:\documents\visual studio 2008\projects\prectice_3\prectice_3\Cat.h(11) : 参见“Prectice_3::Cat”的声明
    这是为什么呢?

    • 已移动 韦恩卑鄙 waywa 2009年5月22日 2:45 C++问题 ([Loc]From:.NET Framework 一般性问题讨论区)
    2009年5月20日 9:41

答案

  • friend void  showN(Prectice_3::Cat &obj1);
    表示将在Cat类能够找到的封闭作用域中的非成员函数showN声明为有元。
    而Prectice::showN()这个prectice是Prectice的成员函数,并不是你那个声明的有元函数。
    friend void  Prectice::showN(Prectice_3::Cat &obj1);
    • 已标记为答案 OrientalBoy 2009年5月22日 15:12
    2009年5月22日 3:21
    版主

全部回复

  • 不大懂c++  但是友元不是只能访问友元么
    有效回复过700 撒花
    2009年5月22日 2:45
  • friend void  showN(Prectice_3::Cat &obj1);
    表示将在Cat类能够找到的封闭作用域中的非成员函数showN声明为有元。
    而Prectice::showN()这个prectice是Prectice的成员函数,并不是你那个声明的有元函数。
    friend void  Prectice::showN(Prectice_3::Cat &obj1);
    • 已标记为答案 OrientalBoy 2009年5月22日 15:12
    2009年5月22日 3:21
    版主
  • 可当我写成friend void  Prectice::showN(Prectice_3::Cat &obj1);后会提示Cat.h(17) : error C2027: 使用了未定义类型“Prectice_3::Prectice”
    我想可能是光用namespace Prectice_3{
     class Mouse;
     class Cat;
    ref class Prectice;};
    声明是不够的必须引用头文件
    但是如果我在Cat.h中加入
    #include "Prectice_3.h"
    那又会重复引用Cat.h
    我该怎么办
    如果用
    #ifndef之类的
    代码到底该如何写
    2009年5月22日 4:56
  • 把void showN(Prectice_3::Cat &obj1)
    的实现写到.cpp中。
    去掉Prectice_3.h中的#include "Cat.h"
    换成声明 class Cat;
    在cat.h中include "Prectice_3.h"


    麻烦把正确答案设为解答。
    2009年5月22日 5:05
    版主
  • 但是这样又提示
    使用了未定义类型“Prectice_3::Cat”
    为什么
    2009年5月22日 5:10
  • 举个例子:
    A.h:

    #include "B.h"
    class A{
     friend void B::func(A& a);
    };

    B.h:
    class A;
    class B 
    {
    public:

     void func(A& a);

    };


    B.cpp:
    void B::func(A& a)
    {

    }


    麻烦把正确答案设为解答。
    2009年5月22日 6:58
    版主
  • 我就是这样弄的
    所以提示
    使用了未定义类型“Prectice_3::Cat”
    2009年5月22日 15:13