一个c++的问题,急!!!!!!!

lzryjj 2008-02-25 03:30:35
是关于类的实例化的问题
有两个类A,B,他们分别继承与c

现在我要是实例化一个类的对象D,
但是有一个前提就是根据一个条件去实例化D,
if(i == 0)
{
B *D = new B() ;
}
else if (i == 2)
{
A *D = new A();
}
就像这样,请问我怎样在头文件中,来声明对象D的类型?
...全文
249 11 打赏 收藏 举报
写回复
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sun_star221 2008-02-26
  • 打赏
  • 举报
回复
2楼就已经很好的回答了你的问题
liveforlov 2008-02-26
  • 打赏
  • 举报
回复
用factory吧,一次写好以后不用再更改和重编基类的包了
hemu1190 2008-02-25
  • 打赏
  • 举报
回复
2楼的吧
Jim_King_2000 2008-02-25
  • 打赏
  • 举报
回复
简单的factory模式能够解决这样的问题。

// EnumType.h
enum EnumType
{
Concrete1,
Concrete2
};

// Factory.h
#include "EnumType.h"

class AbstractClass; // 前向声明

class Factory
{
public:
AbstractClass *Create(EnumType type);
};

// Factory.cpp
#include "Factory.h"
#include "AbstractClass.h"
#include "ConcreteClass1.h"
#include "ConcreteClass2.h"
#include <cassert>

AbstractClass *
Factory::Create(EnumType type)
{
switch (type)
{
case Concrete1:
return new Concrete1;
case Concrete2:
return new Concrete2;
default:
assert(!"Type Error!");
return NULL;
}
}

抽象类与具体类的关系如下:

// AbstractClass.h
class AbstractClass
{
public:
virtual void foo() = 0;
virtual ~Abstract() {}
};

// ConcreteClass1.h
class ContreteClass1 : public AbstractClass
{
virtual void foo()
{
...
}

virtual ~ContreteClass1()
{
}
};

// ConcreteClass2.h
class ContreteClass2 : public AbstractClass
{
virtual void foo()
{
...
}

virtual ~ContreteClass2()
{
}
};

如果想要自动释放指针,可以使用智能指针代替普通指针。商用的factory可以使用std::map。但是上面的代码对于小程序来说已经够用了。
lzryjj 2008-02-25
  • 打赏
  • 举报
回复
谢谢大家
我的问题基本解决
hityct1 2008-02-25
  • 打赏
  • 举报
回复
声明为c,就是基类。利用的是多态。
rabbit729 2008-02-25
  • 打赏
  • 举报
回复
2楼正解
HengStar 2008-02-25
  • 打赏
  • 举报
回复
假设你所有的类均用不同的头文件存放
对应的A类为A.h,B类为B.h
设一个总的头文件main.h
在里面把所有需要的头文件包含进来,注意顺序
基类的头文件要放在子类前面,把要使用该类的头文件包含在该头文件后面
例如当前要使用A,B类的类对应的头文件为C.h
那么就应该在main.h中这样包含

#pragma once
#include "Base.h" //A,B的基类
#include "A.h"
#include "B.h"
#include "C.h"

然后在当前CPP文件中#include "main.h"

或者你不喜欢这样也可以直接在当前CPP文件最前面声明A和B类

class A;
class B;
liyuzhu_1984 2008-02-25
  • 打赏
  • 举报
回复
声明成基类类型
Vitin 2008-02-25
  • 打赏
  • 举报
回复
这样做:

C* D = 0;
//....
if (i == 0)
{
D = new B(); // 不要声明为B*
}
else if (i == 2)
{
D = new A();
}
lzryjj 2008-02-25
  • 打赏
  • 举报
回复
在头文件的声明应该用那个类去声明:

A D;
B D;
还是C D;
谢谢了
相关推荐
发帖
C++ 语言

6.3w+

社区成员

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