class外调用成员函数

xiaolomg 2013-01-26 08:33:55
在一个class A外调用A的某个成员函数,经常发生;
但是class B想这样操作,但不想拥有A的实例,这时候我常常会把class A的那个成员函数写为static的,一般是Get###()之类的函数,当然不爽的是 里面的用到的数据成员也要写为static的,为了这样的操作延长了 data-mem的生命周期;有木有更好的办法呢?
...全文
443 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhaokai115 2013-01-29
  • 打赏
  • 举报
回复
同意楼上的,楼主的需求就不对
zwt069074237 2013-01-29
  • 打赏
  • 举报
回复
没有A的实例就调用他的成员函数不好做吧? 不如把实例指针和函数地址传进来吧,像13楼那样
stereoMatching 2013-01-27
  • 打赏
  • 举报
回复
楼主有没有考虑过strategy pattern? 或者类似strategy的解法?

void B::generic_algo(A *a);
void B::set_strategy(A *a);
void B::set_strategy(std::shared_ptr<A> a); //如果担心A不小心被释放而导致B无法调用的话
另外一个解法

void B::generic_algo(std::function<void()> const &func);
xiaolomg 2013-01-26
  • 打赏
  • 举报
回复
引用 11 楼 mymtom 的回复:
引用 6 楼 boyhailong 的回复:引用 5 楼 sduxiaoxiang 的回复:引用 4 楼 boyhailong 的回复:引用 1 楼 sduxiaoxiang 的回复:把A弄成单例类。 这个还没考虑过 单例 直接调用方法就是 单例 调用对象保证只有一个实例,但是如果我需要多个呢? 为了调用这个memfun而这么做,如果未来需求变了,怎么办? 如果……
所以为了 暂时解决问题的办法是把要引用的mem转为static的,可能真正解决问题的话,要从设计上再多加考虑,或者可以用其他拥有class A实例的对象间接传来。
mymtom 2013-01-26
  • 打赏
  • 举报
回复
引用 6 楼 boyhailong 的回复:
引用 5 楼 sduxiaoxiang 的回复:引用 4 楼 boyhailong 的回复:引用 1 楼 sduxiaoxiang 的回复:把A弄成单例类。 这个还没考虑过 单例 直接调用方法就是 单例 调用对象保证只有一个实例,但是如果我需要多个呢? 为了调用这个memfun而这么做,如果未来需求变了,怎么办?
如果需要多个实例的话,memfun就必须用实例来调用了,因为需求一遍,改动是必然的。
caoh110 2013-01-26
  • 打赏
  • 举报
回复
class A 中 加入 friend class B,让B变成A的友元,这样,它就可以访问A的成员函数了
Crazy_Number 2013-01-26
  • 打赏
  • 举报
回复
引用 6 楼 boyhailong 的回复:
引用 5 楼 sduxiaoxiang 的回复:引用 4 楼 boyhailong 的回复:引用 1 楼 sduxiaoxiang 的回复:把A弄成单例类。 这个还没考虑过 单例 直接调用方法就是 单例 调用对象保证只有一个实例,但是如果我需要多个呢? 为了调用这个memfun而这么做,如果未来需求变了,怎么办?
只实现你需要的好么?不要过度设计…… 小心分析瘫痪
Crazy_Number 2013-01-26
  • 打赏
  • 举报
回复
那就不要做成类,把哪些你要的东西拿出来,或者做一个函数,数据在函数里定义,数据用完之后生命周期就完了。每调用一次函数产生一个复制体,函数完成之后数据被销毁。 真是莫名其妙,追求完美是种病好么!= =
sduxiaoxiang 2013-01-26
  • 打赏
  • 举报
回复
引用 6 楼 boyhailong 的回复:
引用 5 楼 sduxiaoxiang 的回复:引用 4 楼 boyhailong 的回复:引用 1 楼 sduxiaoxiang 的回复:把A弄成单例类。 这个还没考虑过 单例 直接调用方法就是 单例 调用对象保证只有一个实例,但是如果我需要多个呢? 为了调用这个memfun而这么做,如果未来需求变了,怎么办?
单例类 B C D。。都可以调啊 A中的方法又没啥限制
xiaolomg 2013-01-26
  • 打赏
  • 举报
回复
引用 5 楼 sduxiaoxiang 的回复:
引用 4 楼 boyhailong 的回复:引用 1 楼 sduxiaoxiang 的回复:把A弄成单例类。 这个还没考虑过 单例 直接调用方法就是
单例 调用对象保证只有一个实例,但是如果我需要多个呢? 为了调用这个memfun而这么做,如果未来需求变了,怎么办?
sduxiaoxiang 2013-01-26
  • 打赏
  • 举报
回复
引用 4 楼 boyhailong 的回复:
引用 1 楼 sduxiaoxiang 的回复:把A弄成单例类。 这个还没考虑过
单例 直接调用方法就是
xiaolomg 2013-01-26
  • 打赏
  • 举报
回复
引用 1 楼 sduxiaoxiang 的回复:
把A弄成单例类。
这个还没考虑过
xiaolomg 2013-01-26
  • 打赏
  • 举报
回复
引用 2 楼 Crazy_Number 的回复:
还有一个方法,friend关键字。至于你所说的date-mem生命周期建议你重新考虑下你的设计。
只为了调用一个mem-fun,就把整个class设置为friend似乎有点过于开放了; data-mem设为static后,本身生命周期就大于class了,这个....
Crazy_Number 2013-01-26
  • 打赏
  • 举报
回复
还有一个方法,friend关键字。至于你所说的date-mem生命周期建议你重新考虑下你的设计。
sduxiaoxiang 2013-01-26
  • 打赏
  • 举报
回复
把A弄成单例类。

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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