请教 关于类的问题

zf0579 2003-01-22 01:19:57
假设我编写的类为C,其头文件为classc.hpp
class classc:public classb
{
...
myfunction();
...
}
在我的cpp文件内
#include "classb.hpp"

类B的头文件为
#inlcude "classa.hpp"
class classb
{
...
classbfunction(classa* a);
...
}

如果我现在仅想使用classb而又不想包含classa
该怎么修改程序合适呢?

注:可以对头文件,源文件做任意修改
...全文
16 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zf0579 2003-01-29
  • 打赏
  • 举报
回复
显然类的镶套把底层暴露给上层啦,我不知道这样是否就可以让C调用到A啦B::A::GoodFunction();

ckacka 2003-01-24
  • 打赏
  • 举报
回复
其实Zark(金陵五月)提供的方法是最快解决问题的最简单的方法,如果这里不涉及一个多层的,多重的继承关系,无疑这样做最方便。

但是如果象楼主所说的
就上个例子classc是高层应用,classb是中间层,classa是底层。
其实classa很可能需要被其他的中间层或者是高层使用,那么Zark(金陵五月)的方法恐怕就有点问题!
ckacka 2003-01-24
  • 打赏
  • 举报
回复
在面向对象的理论中
最为常见的就是继承和组合:
class B : public A
{
...
};
class B
{
A* a;
};
而继承中,和组合的关系最为紧密的就是私有继承:
class B : private A
{
...
};
他们有很多共同点,也有一点基于基本特性上的差异,

其实我们可以这样解决你的问题:
先看看私有继承的特点:
私有继承(private):私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。
另外:
私有继承时,水平访问和垂直访问对基类中的公有成员也不能访问;

所以我们可以改变组合为私有继承来达到解决问题的目的!不知道楼主觉得这样在你的操作上可行不?
Zark 2003-01-24
  • 打赏
  • 举报
回复
理解上的问题,有一派人把
class A
{
};

class B
{
A* a;
}'
叫has-a派生关系,不过在此不讨论这个问题.

根据楼主所说的,我看可以这样
class B
{
class A
{
public:
void EvilFunction(); // do not want others to call
void GoodFunction(); // could be called by others
};
A a;
public:
void YouCanCall() { a.GoodFunction();}
};
将B类编成DLL给用户,用户可以

class C : public B
{
public:
void HisFunction();
};

void mian()
{
C c;
c.HisFunction();
c.YouCanCall();

B b;
b.YouCanCall();

A a; //- 非法
b.EvilFunction(); //- 非法
c.EvilFunction(); //- 非法
}

不知是否符合楼主要求?
zf0579 2003-01-23
  • 打赏
  • 举报
回复
to zark:
A跟B没有派生关系,B跟C有派生关系
我好像没有写class classb:pbulic classa

另外,从你的文字中我不明白为何B类可以调用A类函数
C类为何就不能调用A类函数 我就不能像B类一样classa *p吗?
我觉得是C类是可以的 这样就获得啦与B类同等的权限啦
可这就是我不希望的

另外,谁也不会去修改编译后的文件的头文件的




Zark 2003-01-23
  • 打赏
  • 举报
回复
不知道什么是"恶意调用"? 不过楼主的问题实际上是不是可以简化成:

派生结构为A->B->C,其中A->B是 has-a 的结构,而B->C是is-a的结构,希望C的用户不可使用A中的某些函数.

如果是这样,可以将不希望C调用的函数在A类中声明为protected,这样B类可以使用,但C类不可使用.

楼主有一误解,有头文件并不能调用头文件中函数.因为在提供给B类或是C类使用的时候,A类一般已被编译成LIB或是DLL,楼主即使是拿到A类的头文件,把其中的protected换成public 也是无济于事的.当然如果楼主是把源代码和头文件一齐交给B/C类的用户,那么就是把KGB叫来也挡不住B/C类用户的调用.
zf0579 2003-01-23
  • 打赏
  • 举报
回复
我觉得中间层可以参考以下要求做:
1 首先将自己用的头文件放在源文件前面,而不是源文件的头文件里面。
2 对于好使用的底层调用,可以考虑动态创建删除,这样高层是不会知道下层的调用的。
以上大致可以满足要求
zf0579 2003-01-22
  • 打赏
  • 举报
回复
我就是想改 就是缺乏方向啊
ITMSC 2003-01-22
  • 打赏
  • 举报
回复
如果这些文件都是你写的,那么你到了该重新考虑设计的时候了。
不要心慈手软,改来改去的做法只能使你的程序面目全非。
祝你好运!
zf0579 2003-01-22
  • 打赏
  • 举报
回复
如果我有h文件,我就可以恶意的调用底层的函数啦
windcsn 2003-01-22
  • 打赏
  • 举报
回复
其实流星说的没有错!
你在b中使用classa了,但是你的classc又是从b继承的,当然在便宜的时候肯定需要其.h文件,如果你不想要,没有办法只能全部kill掉。
但是我想你需要的可能不是这个意思,你的a对b可见,但是又要对c不可见,这是继承的问题,只要在使用a的地方你都设计为private的接口,我想应该没有什么问题了。但是仍然在编译的时候要.h文件。
疯狂的魔法 2003-01-22
  • 打赏
  • 举报
回复
classbfunction(classa* a);
改成void *
在classb的实现里
#inlcude "classa.hpp"
然后做个类型转换
classbfunction(void* a);
{
(classa *)a->....
}
zf0579 2003-01-22
  • 打赏
  • 举报
回复
to 流星:
你这么粗鲁的解决问题 那一切问题都不是问题啦
谁都知道这么做就可以解决啦 还有必要探讨嘛?

实际问题是我在编写基于中间层的高层应用程序时 发现即使最底层的头文件内的函数由于按照以上的定义方式都是可见的 如果底层头文件不给出就编译不通过 如果底层调用可见这对于软件系统安全当然不利 中间层的作用也就不是很好。
就上个例子classc是高层应用,classb是中间层,classa是底层。
望高手指教
bugfree 2003-01-22
  • 打赏
  • 举报
回复
for you will need the classa in your B header file
classbfunction(classa* a);
So I do not think you can do that except you does delete this sentence from classb,
then you can not include classa.hpp in B's header file.
sunwhite 2003-01-22
  • 打赏
  • 举报
回复
把这个#inlcude "classa.hpp"屏蔽掉就行了。
还把凡是classa的代码都屏蔽掉。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧