一个关于类继承可能产生的无穷递归问题

yfjok22 2016-12-20 09:39:47
各位大侠,
最近开代码包时看到了一段有点奇怪的代码,想请教一下

namespace Foam
{

// Forward declaration of classes
class particle;

class polyPatch;

class cyclicPolyPatch;
class processorPolyPatch;
class symmetryPlanePolyPatch;
class symmetryPolyPatch;
class wallPolyPatch;
class wedgePolyPatch;

// Forward declaration of friend functions and operators

Ostream& operator<<
(
Ostream&,
const particle&
);

bool operator==(const particle&, const particle&);

bool operator!=(const particle&, const particle&);

/*---------------------------------------------------------------------------*\
Class Particle Declaration
\*---------------------------------------------------------------------------*/

class particle
:
public IDLList<particle>::link

{
...
}


个人感觉有点奇怪的是这里particle这个类在集成父类IDLList<particle>时的执行过程
这里父类IDLList<template>中的模板利用particle进行了实例化,然而particle本身又是由IDLList<particle>派生得到的,那这样是否会形成一个无穷的递归调用,即particle实例化要先完成IDLList<template>的实例化,而IDLList<template>的template实例化时有要先让particle实例化,这样下去岂不是无穷调用了
请各位大侠帮忙分析分析,谢谢
...全文
210 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ID870177103 2016-12-21
  • 打赏
  • 举报
回复
不会无穷递归,IDLList<particle>叫未定义类型 只有编译器尝试取得一个未定义类型的大小或成员的时候才会且一定会出错 如果只是声明了IDLList<particle>的指针或者link类只是把IDLList<particle>当命名空间是没有问题的
GKatHere 2016-12-21
  • 打赏
  • 举报
回复
呵呵,有意思,这样模拟了多态。


template<typename _TP>
class C
{
public:
	typedef _TP PAR;
	PAR* p;

	C(_TP* p_)	:p(p_){};
	void f()const{return p->f();};
};

template<typename _TP>
class B	:	public C<B<_TP> >
{
public: 
	typedef _TP PAR;
	PAR* p;

	B(_TP* p_)	:C(this), p(p_){};
	void f()const{return p->f();} ;
};
class A:	public B<A>
{
public:
	A()	:B(this){};				//	warning C4355: “this”: 用于基成员初始值设定项列表
	void f()const{cout << "the end!" <<endl;} ;
};

void f(const C<B<A> >& c)		//	
{
	c.f();
}

int _tmain(int argc, _TCHAR* argv[])
{
	A a;
	
	f(a);

	printf("The End\n");
	::getchar();
	return 1;
}

SK_AJIE 2016-12-21
  • 打赏
  • 举报
回复
public IDLList<particle>::link,你把他(particle)理解成一个占位符(标记)就行,此时并不会真正的需要particle,只有在真正使用时会去访问这个类型
xskxzr 2016-12-20
  • 打赏
  • 举报
回复
大概跟这种用法类似: class T { T *p; }
ipqtjmqj 2016-12-20
  • 打赏
  • 举报
回复
引用 2 楼 yfjok22 的回复:
[quote=引用 1 楼 ipqtjmqj 的回复:] 模板实例化好比宏,只需要一个名字就可以,也就是只需要类的声明,不需要类的定义
没打理解你的意思 这里particle类要实例化需要先完成父类IDLList<template>中模板template的实例化 然而这里是用particle这个尚未完成定义的类来完成IDLList中模板的实例化,这个难道不会报错么[/quote] 请给出IDLList的定义。另外你为何不试一试呢
yfjok22 2016-12-20
  • 打赏
  • 举报
回复
引用 1 楼 ipqtjmqj 的回复:
模板实例化好比宏,只需要一个名字就可以,也就是只需要类的声明,不需要类的定义
没打理解你的意思 这里particle类要实例化需要先完成父类IDLList<template>中模板template的实例化 然而这里是用particle这个尚未完成定义的类来完成IDLList中模板的实例化,这个难道不会报错么
ipqtjmqj 2016-12-20
  • 打赏
  • 举报
回复
模板实例化好比宏,只需要一个名字就可以,也就是只需要类的声明,不需要类的定义

64,282

社区成员

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

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