关于C++模板的困惑

MarcoCC 2006-03-30 05:21:15
今天无聊中写了以下一段代码:
#include <iostream>

template<class TC>
class other
{
public:
other(){};
~other(){};
TC *ptc;
void eat(){
ptc->catrun(5); //困惑?
}
};

template<class TC>
class base
{
public:
base(){};
virtual ~base(){};
other<TC> o1; // 模板类成员
};

class derived : public base<derived>
{
public:
derived(){};
~derived(){};
void catrun(int i){
int j = 0;
j += i;
std::cout << "j : " << j << std::endl;
}
};

int main()
{
derived derived1;
derived1.o1.eat();
return 0;
}

在实例化derived之后,base类和其成员O1也被实例化了,

但我的困惑在于,此时O1中的指针ptc并没有初始化,但是程序执行到语句
ptc->catrun(5);
时不会报错,且能输出正确的结果

这是为什么?
...全文
114 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
MarcoCC 2006-03-30
  • 打赏
  • 举报
回复
明白了,多谢大家。
healer_kx 2006-03-30
  • 打赏
  • 举报
回复
这个无所谓是不是模板的.
因为你的类成员函数,没有使用到成员变量,也就是没有使用到this指针.
所以即使没有类实例也无所谓了.
boodweb 2006-03-30
  • 打赏
  • 举报
回复
跟模板无关,这样也可以运行:
class A{
public:
void test(int a)
{
cout<<a<<endl;
}
};
int main()
{
A *p=0;
p->test(3);
}
其实p->test(3)会转换成test(p,3),这里test中没有用到类成员,因此没有引用p的可能,所以不管p是什么,甚至可以不初始化,调用结果都是一样的
当然,这种做法是应该避免的
herman~~ 2006-03-30
  • 打赏
  • 举报
回复
同意: madmanahong(疯子阿虹) ( ) 信誉:100 2006-03-30 17:33:00 得分: 0



postren 2006-03-30
  • 打赏
  • 举报
回复
学习一下
madmanahong 2006-03-30
  • 打赏
  • 举报
回复
1。这个和模版没有任何关系。
2。通俗的说,类成员函数不属于类对象啊。

你可以这样
class A
{
void catrun(int i){
int j = 0;
j += i;
std::cout << "j : " << j << std::endl;
}
};

int main()
{
A* a;
a->catrun( 5 );
}

理解这个你就理解上面的例子了~
:)
MarcoCC 2006-03-30
  • 打赏
  • 举报
回复
忘了说了,以上代码是在VC6和VS2003的环境中测试的。

64,647

社区成员

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

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