下层的类如何获得上层类的数据?

zyi1201 2008-09-25 07:25:04
class A
{
public:
int GetNumber();
private:
B m_b;
int m_number;

};

class B
{
void fuction1();
void fuction2();
};

从层次上,B是A的数据成员,A包含B。
而我在B的成员函数里需要只知道A的数据成员,或者使用A的方法,要如何实现,怎么做会比较好?
在B里面,我不想再声明一个class A的指针,和m_number,因为这些不应该属于B。
...全文
323 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
arong1234 2008-10-03
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 zyi1201 的回复:]
引用 14 楼 lyghe 的回复:
非常感谢!
我要得到的答案差不多就是这样子的。
只可惜你楼上的都没看懂。
您真牛!
多教小弟点吧!
问您个问题,哪些模式比较常用?(除了单件和工厂)
我正准备好好学学设计模式,可是时间有限。
[/Quote]

每种模式都很有用的,因为他们已经是精挑细选过的了,没有用的根本不会有人把它归纳进模式
工厂和单件之所以大家更熟悉,不是因为它有用,而是由于它最简单
csucdl 2008-10-03
  • 打赏
  • 举报
回复
1) 我怀疑B存在的理由。
zyi1201 2008-10-03
  • 打赏
  • 举报
回复
那常用的有哪几个?
tobylee999 2008-10-03
  • 打赏
  • 举报
回复
哈哈,来迟了。明显是使用接口解决依赖性问题嘛~~
zyi1201 2008-09-29
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 lyghe 的回复:]
很显然,这是一个接口回调的问题。

C/C++ codeclass IA
{
virtual int GetNumber() = 0;
};
class A : public IA
{
public:
virtual int GetNumber();
private:
B m_b;
int m_number;

};

class B
{
public:
IA * m_pA;
void fuction1();
void fuction2();
};


在A中把this赋值给m_b->m_pA。

具体的模式名嘛,好像是叫做什么什么的,忘了。
[/Quote]
非常感谢!
我要得到的答案差不多就是这样子的。
只可惜你楼上的都没看懂。
您真牛!
多教小弟点吧!
问您个问题,哪些模式比较常用?(除了单件和工厂)
我正准备好好学学设计模式,可是时间有限。
lyghe 2008-09-27
  • 打赏
  • 举报
回复
很显然,这是一个接口回调的问题。
class IA
{
virtual int GetNumber() = 0;
};
class A : public IA
{
public:
virtual int GetNumber();
private:
B m_b;
int m_number;

};

class B
{
public:
IA * m_pA;
void fuction1();
void fuction2();
};

在A中把this赋值给m_b->m_pA。

具体的模式名嘛,好像是叫做什么什么的,忘了。
lyghe 2008-09-27
  • 打赏
  • 举报
回复
写错了。把A的基类去掉。
lyghe 2008-09-27
  • 打赏
  • 举报
回复
复杂一点,像这样:
//.h
//环境查询者接口
class IEnvQuerier
{
public:
virtual int GetNumber() = 0;
};
//A环境查询者
class AQuerier : public IEnvQuerier
{
public:
virtual int GetNumber();

A * m_pA;
};

//A环境
class A : public IA
{
public:
A();

virtual int GetNumber();
private:
B m_b;
int m_number;

//内部实现一个自己的环境查询者
AQuerier m_querier;
};

class B
{
public:
//环境查询者接口
IEnvQuerier * m_pEnv;
void fuction1();
void fuction2();
};

//.cpp
int AQuerier::GetNumber()
{
return m_pA;
}

A::A()
{
m_querier.m_pA = this;
m_b.m_pEnv = m_querier;
}
oo_v_oo 2008-09-25
  • 打赏
  • 举报
回复
如果LZ一定要这样使用,在确保B只在A中声明,可以这样用,有危险啊
大概思路

void B::fun1() {
A * pA;
pA = (A *)(this - (void *)(&(((A*)0)->m_b)));
pA->GetNumber();
// pA 就是
}
dirdirdir3 2008-09-25
  • 打赏
  • 举报
回复
如果真的要这样做,可以考虑把B的那个方法拆开成根据m_number不同而不同的几个函数,由A根据m_number决定B的哪个函数.
不过这样做其实是把B的那个方法由A来实现,不是很好的方法............
dirdirdir3 2008-09-25
  • 打赏
  • 举报
回复
A包含B,但是A和B是没有任何关系的(只是A知道B的一个实例而已).B需要知道A的成员就必须由A传递进去.
回调函数的话还不如直接传数据(回调函数是传函数指针而已).
taodm 2008-09-25
  • 打赏
  • 举报
回复
显然,b不是a的组成部分。
你得重新定位它们的关系。
zyi1201 2008-09-25
  • 打赏
  • 举报
回复
或者能不能用什么模式重新设计它们之间的关系 ???
zyi1201 2008-09-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ztz0223 的回复:]
你大概是想如果访问成员就不访问方法,访问方法就不要成员对吧。
应该不可能,c++语法里面就没有说可以这样的,模式也是在c++语言的基础上的,应该不可逾越
[/Quote]
不是的
我正在做一个项目,这个问题是因为在我在项目里面 A类必须包含B类的成员,就是说从层次上B类是为A类服务的,A类只作一些业务上的事。但是B类有一个方法里须要用到A类的数据,根据A类的这个数据不同,处理的方法也不同。如果我在B类里面也设置了一个m_number的变量,然后将A类的m_number更新过来,这样的话,也是可以实现的。可是,m_number这个数据从业务上分析,只应该存在于A类中,而不应该出现在B类里面。所以我不想这样做。
听别人说好像可以用回调函数,或者是什么函数指针来实现,可是我不懂。
就呆在云上 2008-09-25
  • 打赏
  • 举报
回复
你大概是想如果访问成员就不访问方法,访问方法就不要成员对吧。
应该不可能,c++语法里面就没有说可以这样的,模式也是在c++语言的基础上的,应该不可逾越
zyi1201 2008-09-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lzr4304061988012 的回复:]
C/C++ code
class B
{
void fuction1();
void fuction2();
};

class A
{
friend class B ;
public:
int GetNumber();
private:

int m_number;

};
[/Quote]
你没看清我的问题
我的代码里面,B是作为A的一个成员变量。
而且公共的,私有的这些东西我懂。
zyi1201 2008-09-25
  • 打赏
  • 举报
回复
有没有什么模式可以实现?
lzr4304061988012 2008-09-25
  • 打赏
  • 举报
回复

class B
{
void fuction1();
void fuction2();
};

class A
{
friend class B ;
public:
int GetNumber();
private:

int m_number;

};


zyi1201 2008-09-25
  • 打赏
  • 举报
回复
楼上的,拜托看清问题!
richbirdandy 2008-09-25
  • 打赏
  • 举报
回复
m_number是私有的 用不了
GetNumber()是公有的 直接用

void fuction1(){GetNumber();}
加载更多回复(1)

5,529

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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