游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4534|回复: 16

基????:?承和友元

[复制链接]

12

主题

217

帖子

220

积分

中级会员

Rank: 3Rank: 3

积分
220
发表于 2007-5-24 00:32:00 | 显示全部楼层 |阅读模式

  1. class part
  2. {
  3.     friend class decorater;
  4. protected:
  5.     part(){};
  6.     ~part(){};
  7.     void dosomething(){};
  8. };

  9. class Idecorater
  10. {
  11. public:
  12.     virtual ~decorator(){};
  13.     virtual void decoratedoption() = 0;
  14. protected:
  15.     part * m_apart;
  16. };

  17. class subdecorater : public Idecorator
  18. {
  19. public:
  20.    subdecorater();
  21.    virtual ~subdecorater();
  22.    
  23.    virtual void decoratedoption();
  24. };

  25. subdecorater::subdecorater()
  26. {
  27.     m_apart = new part();  // can't access protected menber
  28. }

  29. subdecorater::decoratedoption
  30. {
  31.     m_apart->dosomething(); // can't access protected menber
  32.     // do something..
  33. }

  34. int main(...)
  35. {
  36.    Idecorater * adecorater = new subdecorater();
  37.    //...
  38.    delete adecorater;
  39. }
复制代码

上面protected menter access denie的地方就是我困惑的地方,既然subdecorater?承自Idecorater,也就表明其?ο笠彩且??Idecorater,但是Idecorater的友元part的protected方法?楹?o法?用???????大家,?多指教一下。

8

主题

284

帖子

296

积分

中级会员

Rank: 3Rank: 3

积分
296
QQ
发表于 2007-5-24 02:52:00 | 显示全部楼层

Re:基????:?承和友元

decorater是part的朋友,但part不是decorater的朋友。

如同,你的东西是我的东西,我的东西还是我的。

16

主题

280

帖子

280

积分

中级会员

Rank: 3Rank: 3

积分
280
QQ
发表于 2007-5-24 07:37:00 | 显示全部楼层

Re:基????:?承和友元

part只声明了“基类”为友元,并无声明“基类”的“派生类”为友元,那句话有问题,“派生类”含有“基类”

8

主题

284

帖子

296

积分

中级会员

Rank: 3Rank: 3

积分
296
QQ
发表于 2007-5-24 11:57:00 | 显示全部楼层

Re:基????:?承和友元

一种解决方法是把part的构造和析构函数申请也public,因为protected定义在类part看来其意义如同private意义一样(当然有类part的继承类就多了几层意义了,实际还是属于private意义内)。

如果既然你不想让类part让其它类使用,那又何必申明成为别人的友元呢?如果把关系弄复杂了,后面很难弄明白的,或者很麻烦才能弄明白。

另外,友元属性是无法被继承的。

29

主题

354

帖子

359

积分

中级会员

Rank: 3Rank: 3

积分
359
QQ
发表于 2007-5-24 18:50:00 | 显示全部楼层

Re:基????:?承和友元

声明了是哪个类的友员就是哪个类的友员,不承认继承关系.

12

主题

217

帖子

220

积分

中级会员

Rank: 3Rank: 3

积分
220
 楼主| 发表于 2007-5-24 19:11:00 | 显示全部楼层

Re:基????:?承和友元

起初??釉O??的目的是因??art是Idecorater抽象?的子?的必要构件,构造函?翟O置成protected是希望只有Idecorater和他的子?能???建part(最初"良好的"愿望),Idecorater定?一?操作,由其子?具体???,?谋砻嫔???art?藏的dosomething方法?行?接?用,并丰富其???.

????知道如何???呢? ??大家了.

12

主题

217

帖子

220

积分

中级会员

Rank: 3Rank: 3

积分
220
 楼主| 发表于 2007-5-24 19:16:00 | 显示全部楼层

Re:基????:?承和友元

?Σ黄 有????, 在Idecorater中的m_apart是protected?傩?能被子??承. 原文已修改

8

主题

284

帖子

296

积分

中级会员

Rank: 3Rank: 3

积分
296
QQ
发表于 2007-5-24 21:03:00 | 显示全部楼层

Re:基????:?承和友元

你把关系搞清楚点儿,就知道怎么做了,所以继续看书吧。

12

主题

217

帖子

220

积分

中级会员

Rank: 3Rank: 3

积分
220
 楼主| 发表于 2007-5-24 21:59:00 | 显示全部楼层

Re:基????:?承和友元

???巧希?绻?钦Z法???大可自己看??恕>?O?碚f,subdecorater就是一??Idecorater,而friend在??的意????就是“白?非?”,我?K非要????﹀e,我?的代????就是?的。只??大家???思路,替代的???方法可有??┱?大家指??乙幌隆

8

主题

284

帖子

296

积分

中级会员

Rank: 3Rank: 3

积分
296
QQ
发表于 2007-5-24 22:51:00 | 显示全部楼层

Re:基????:?承和友元

把m_apart初始化放在基类里,因为基类是友元所以可以做,再在基类里用个成员函数里使用m_apart->dosomething();,同样因为是友元的原因。

然后派生类使用从基类里继承的那个有“m_apart->dosomething();”调用的成员函数的返回结果,就可以了。

或者,也把派生类也定义为友元…………

这是我的方案。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 08:06

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表