找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 737|回复: 6

[ARX程序]:请教一个C++的问题

[复制链接]
发表于 2004-8-9 13:40:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
class baseClass
{
...
protected:
type m_var;
};

class classA: public baseClass
{
...};

class classB: public someotherbaseClass
{ ...};

请教:如何在classB中存取classA中的保护成员变量m_var,有没有一些特殊的技巧之类的,先谢了.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-8-9 14:30:52 | 显示全部楼层
[B]Friends[/B]

In some circumstances, it is more convenient to grant member-level access to functions that are not members of a class or to all functions in a separate class. With the [B]friend[/B] keyword, programmers can designate either the specific functions or the classes whose functions can access not only public members but also protected and private members.

[PHP]
// Example of the friend class
class YourClass
{
friend class YourOtherClass;  // Declare a friend class
private:
   int topSecret;
};

class YourOtherClass
{
public:
   void change( YourClass yc );
};

void YourOtherClass::change( YourClass yc )
{
   yc.topSecret++;    // Can access private data
}
[/PHP]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-8-9 17:18:36 | 显示全部楼层
非常感谢回答,只不过为的意思是说baseClass和classA已经固定好了,不能再改了!不好意思,把这句话给落了。实际上我是想这样做:
我定义了一个非CFrameWnd基类的类,想在类中存取acedGetAcadFrame()返回指针中的,属于CFrameWnd类中的保护成员,怎么作?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-8-10 22:10:01 | 显示全部楼层
如果清楚 class A中成员变量的定义结构,存取其私有、保护 成员变量的值不困难:

  1. class A
  2. {
  3. ...........
  4. private:
  5.     type m_x;
  6. };

  7. class B
  8. {
  9. ...........
  10. public:
  11.     type m_x;
  12. };

class B的成员变量的定义结构与class A一样,只是把class A中的private 改成public


  1.   A  demoA;
  2.   B  *pB;
  3. .........
  4.   pB = (B *) &demoA;
  5.   pB->m_x = ...;
复制代码


这里的pB->m_x实际上是等效 demoA.m_x,只是C++接受前者而不接受后者。

-----------------
楼主Hellow提出的情况比较复杂,必须把baseClass 和classA映射到两个新的
class,这两个新的class中的成员变量的定义结构必须分别与baseClass 和classA
相同,而存取权限private / protected 改成public.

-----------------
C++中提供的private/protected的所谓数据保护,本人还没有看出对程序本身、
对程序员有什么益处,倒是看到不少坏处:ObjectARX class中的成员数据大量
用protected/private "保护",对这些数据的存取必须经过成员函数调用,
影响程序运行效率!
------------------
又:
类的成员函数定义一般不会影响类对象中的成员数据结构(偏移量),
不过本人发现,析构函数是否虚拟化( 前置 virtual ),会影响类对象
总的sizeof()值,可能与位对齐有关,具体影响情况,本人没有深
究,不知道哪里可以查阅到相关资料。

========================================
又:
对于protected:[/COLOR] 下的成员变量的存取有一个简单方法,以Hellow
给的例子为例:


  1. class baseClass
  2. {
  3. ...
  4. protected:
  5. type m_var;
  6. };

  7. class classA: public baseClass
  8. {
  9. ...};

  10. [COLOR=Blue]
  11. class  classT : publc classA
  12. {
  13. public:
  14.      type & as_Mvar() {
  15.          return m_var;
  16.      }
  17. };

  18. [/COLOR]
  19. class classB: public someotherbaseClass
  20. {
  21. ....
  22. [COLOR=Blue]
  23.      void  DemoFunc() {
  24.          classA  demoA;
  25.          classT  *pT= (classT *) &demoA;

  26.          pT->as_Mvar() = ...;  // 这里的pT->as_Mvar() 与m_var等效
  27.          ............
  28.      }
  29. [/COLOR]
  30. ....
  31. };

复制代码


注意:classT 中不得定义有任何成员变量!
[/COLOR]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-8-11 00:39:05 | 显示全部楼层
高,高,实在是太高了!!!!!!!!我怎么就没想到从类事例在内存中的实际存储方式这个角度来考虑,非常感谢!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-8-11 08:05:24 | 显示全部楼层
我感觉上面方法使得类的封装失去了意义,不到不得以的情况下,还是不要用的好。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-8-11 09:15:50 | 显示全部楼层
就是到了不得以的情况下,只要能实现,许多问题就迎刃而解了!一般情况下我也不想那么麻烦!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-6 03:55 , Processed in 0.379938 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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