一个关于设计模式的问题!!(比较有深度的问题)

supercwj 2005-05-17 12:29:20
各位大虾,小弟有一个问题困或了很久没有得到解决。所以一直感觉C比C++灵活!
这个问题是这样的,

比如
我有两个辅助类,Class1和Class2。这两个类是主要给其他类使用的。而且假设Class1使用Class2的功能,并且Class2也使用Class1的功能。
问题是这样的我想把Class1和Class2封装在一个命名空间中,让别的类使用,请问该怎么做?

希望大家可以给我一点思路,最后在送给我一个示例程序,发送给supercwj@tom.com
或者是我这里有个简单的示例程序,我发给你,请你帮我改改在发回给我!
欢迎有实际项目经验的朋友,或者研究过STL源码的朋友提供你们的解决思路!
无限感激!
...全文
194 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
CodeProject-Jerry 2005-05-18
  • 打赏
  • 举报
回复
friend class

用 抽象工厂设计模式
supercwj 2005-05-17
  • 打赏
  • 举报
回复
up
supercwj 2005-05-17
  • 打赏
  • 举报
回复
睡觉先
希望尽快有答案
明天在线等
supercwj 2005-05-17
  • 打赏
  • 举报
回复
确实具体问题具体分析!
没有死方法。
关键是方便,不会出错!
如果方便的话,你认为有什么好的例子,比较有启发性的
请发到我的邮箱!supercwj@tom.com
谢谢了!
xt_jat 2005-05-17
  • 打赏
  • 举报
回复
具体问题具体分析, 我在写类似的问题时,一种方法是会抽象Class1 写一个更基础的纯接口基类A, 则Class2 包含的就只是A 而不是Class1了

当然还有其它方式,一句话,跟具体应用有关,没有一定之规, 设计模式也得灵活运用
supercwj 2005-05-17
  • 打赏
  • 举报
回复
to xt_jat(桑巴) ( )
怎么改进?
有更好的设计思想吗?
我就只有这两种方法?
请指点!!
supercwj 2005-05-17
  • 打赏
  • 举报
回复
自己有点眉目了!
jerry 2005-05-17
  • 打赏
  • 举报
回复
// a.h

#ifndef _A_H_
#define _A_H_
class CB;
class CA
{
void CallB(CB* pb);
...
};
#endif


// b.h
#ifndef _B_H_
#define _B_H_

class A;
class B
{
void CallA(CA* pa);
....
};
#endif


// a.cpp
#include "a.h"
#include "b.b"

void CA::CallB(CB* pb)
{
pb->PrintB();
}
...

// b.cpp
#include "a.h"
#include "b.h"

void CB::CallA(CA* pa)
{
pa->PrintA();
}
...


xt_jat 2005-05-17
  • 打赏
  • 举报
回复
我有两个辅助类,Class1和Class2。这两个类是主要给其他类使用的。而且假设Class1使用Class2的功能,并且Class2也使用Class1的功能。
问题是这样的我想把Class1和Class2封装在一个命名空间中,让别的类使用,请问该怎么做?
???

为什么要写成这样,这种类结构没法改进了吗?
supercwj 2005-05-17
  • 打赏
  • 举报
回复
to oyljerry(【勇敢的心】→ ㊣X-Man㊣) ( )
谢谢你的提示,但是能不能按我的要求说说你的解决方法!

发现没有CSDN人少了很多!
supercwj 2005-05-17
  • 打赏
  • 举报
回复
如果是使用c语言的话就不用这么麻烦了!
supercwj 2005-05-17
  • 打赏
  • 举报
回复
发现以上的回答,没有跟我想的效果一样!
我认为,一个系统可能只需要一个类的实例(比如是日记类等)
那么我可以使用一个大类(管理类)来管理这些辅助的类,但是调用的时候
就要管理类.日记类.方法名
这样做,麻烦不好看。
如果使用命名空间的话
只需要using namespace 空间名
就可以直接日记类.方法名
比较好看
supercwj 2005-05-17
  • 打赏
  • 举报
回复
谢谢你的答复!
有个问题想请教的是,如果我将这两个类放在不同的文件(.cpp和.h)中声明和定义
请问该怎么做!
oyljerry 2005-05-17
  • 打赏
  • 举报
回复
注意头文件防止重复包含和类的前置申明就好了
jerry 2005-05-17
  • 打赏
  • 举报
回复
////////////////////////////////////////////////
// a.h - declare class CA, CB

#ifndef _TEST_A_H_
#define _TEST_A_H_

#pragma once

#include <iostrean>

namespace Test // begin namespace Test
{

// forward reference
class CB;
class CA;

// declare class CA
class CA
{
public:
void PrintA() { std::cout << "CA::PrintA" << std::endl; }
void CallB(CB* pb); // call CB member function
};

// Declare class CB
class CB
{
public:
void PrintB() { std::cout << "CB::PrintB" << std::endl; }
void CallA(CA* pa); // call CA member function in CB
};


} // end of namespace Test

#endif

////////////////////////////////////////////////////////////
// a.cpp - implement class CA and CB

namespace Test
{
void CA::CallB(CB* pb)
{
pb->PrintB();
}

void CB::CallA(CA* pa)
{
pa->PrintA();
}

} // end of namespace Test


/////////////////////////////////////////////////////////////////////
// main.cpp -- test class CA, CB main source file

#include "a.h"

int main()
{
Test::CA a;
Test::CB b;


a.PrintA();
b.PrintB();

a.CallB(&b);
b.CallA(&a);
}


//////////////////////////////////////////////////////////
//
// 注,以上代码随手写的, 应该没什么大问题

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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