最近研究emule电驴的代码,觉得有很多地方怪怪的,想请教大家两个不解的地方:
1 在类的定义中把自己类声明为友元类,如:
class CAICHHashTree
{
friend class CAICHHashTree;
...//后面省略
};
不知道这样做有什么用处呢?2 在类的构造函数中,把自己成员的类型强制转换成其他类型的用意又是什么呢?如:
class A
{
CString m_str;
...//省略
A()
{
(void)m_str; //这里的代码又起到什么用呢?
};
}

解决方案 »

  1.   

    友元类中的函数可以访问其朋友中的protect成员吧
      

  2.   

    根据楼上众朋友的观点写了段测试代码,如下:
    class A
    {
    //friend class A;
    private:
    int m_iPrivate; //私有成员
    protected:
    int m_iProtected; //保护成员
    public:
    int m_iPublic; //公有成员
    A(int a=100,int b=200,int c=300):m_iPrivate(a),m_iProtected(b),m_iPublic(c) {}
    int GetValue()
    {
    A aa(1,2,3);
    return aa.m_iPrivate+aa.m_iProtected; //访问了同一个类其他对象的私有和保护成员
    }
    };
    结果表明:不管有没有注释掉friend class A;这行代码,VC6下编译都能通过,也都可以得到正确结果,结论是:不必声明自己类为友元类,同一个类的不同对象之间,也可以随意访问其他对象的私有和保护成员。(注:对任何一个对象来说,自己的私有和保护成员,自己还是不能访问的。)
    看来为了访问私有和保护成员的说法不完全正确,那这种做法是否另有用意呢,等待楼下其他朋友的看法!
      

  3.   

    1:貌似没有用
    2: 造成没没m_str被使用的假象,有时可以减少一些警告
      

  4.   

    我觉得这两种做法都是画蛇添足的做法,问题2中强制转换成其他类型的有效期也仅限在转换的当前行代码,下一行或下一次使用m_str依然是原来的CString类型,所以也是多余的。
    看了一部分电驴的代码后,感觉编码风格也不怎样,有些对象的命名不规范不说,类里面还经常直接调用全局变量,这样类的代码在其他工程中重用时,一定会有不少麻烦,虽然人家可能也不打算重用了。菜鸟的一点浅见,请大家指正!
      

  5.   

      补充一下 楼主仔细看一下 源码 第二个m_str是不是另有意图