C++ 可以这样定义?

bandaoyu 2018-12-16 11:32:04
学习智能指针,看到下面这个部分:

/* 
* file name : smartpointer.h
* desp : 智能指针版本v3
*/
#ifndef __SMARTPOINTER_H__
#define __SMARTPOINTER_H__

template <typename T> // 将智能指针类定义成模板类
class SmartPointer {
public:
// 默认构造函数
SmartPointer():mPointer(NULL) {std::cout <<"Create null smart pointer."<< std::endl;}
// 接收不同对象类型的构造函数
SmartPointer(T *p):mPointer(p) {
std::cout <<"Create smart pointer at "<<static_cast<const void*>(p)<<std::endl;
/*智能指针指向类T,引用计数加1*/
if (mPointer) mPointer->incRefCount();
}
// 析构函数
~SmartPointer(){
std::cout << "Release smart pointer at "<<static_cast<const void*>(mPointer)<<std::endl;
// 实现内存资源自动销毁机制
if (mPointer && mPointer->decRefCount()==0) delete mPointer;
}
// 拷贝构造函数
SmartPointer(const SmartPointer &other):mPointer(other.mPointer) {
std::cout <<"Copy smart pointer at "<<static_cast<const void*>(other.mPointer)<<std::endl;
// 引用计数加1
if(mPointer) mPointer->incRefCount();
}
// 赋值操作符
SmartPointer &operator = (const SmartPointer &other) {
T *temp(other.mPointer);
// 新指向对象,引用计数值加1
if (temp) temp->incRefCount();
// 原指向对象,引用计数值减1,如果减1后引用计数为0 销毁原资源对象
if (mPointer && mPointer->decRefCount()==0) delete mPointer;
// 智能指针指向新资源对象
mPointer = temp;
return *this;
}

private:
T *mPointer; // 指向智能指针实际对应的内存资源,根据参数自动推导规则,定义内部资源指针类型
};

/*引用计数基类*/
class RefBase
{
public:
RefBase() : mCount(0){ }
void incRefCount(){
mCount++;
}
int decRefCount(){
return --mCount;
}
// 调试接口,返回对象当前引用计数
int getRefCount(){
return mCount;
}
virtual ~RefBase(){ }
private:
int mCount;
};
#endif // __SMARTPOINTER_H__


class SmartPointer 定义在class RefBase 前面,而且class SmartPointer中的定义也没有看到用: 继承之类的操作,mPointer怎么就凭空能调用 mPointer->incRefCount()等这些方法?


文章接下来是这样用的,下面我理解,上面的定义部分我不能理解:

/* 
* file name : sptestcase3.cpp
* desp : 智能指针测试代码 case3 测试智能指针的引用计数功能
*/

#include <iostream>
#include "smartpointer.h"

/*继承于引用计数基类的SomeClass类*/
class SomeClass: public RefBase{
public:
SomeClass(){std::cout << "SomeClass default constructor !"<<std::endl;}
~SomeClass(){std::cout << "SomeClass deconstructor !"<<std::endl;}
};

void testcase3(void)
{
SomeClass *pSomeClass = new SomeClass(); //1
SmartPointer<SomeClass> spOuter = pSomeClass;
std::cout << "SomeClass Ref Count (" << pSomeClass->getRefCount() << ") outer 1."<< std::endl;
{ // inner 语句块
SmartPointer<SomeClass> spInner = spOuter;
std::cout << "SomeClass Ref Count (" << pSomeClass->getRefCount() << ") inner."<< std::endl;
}
std::cout << "SomeClass Ref Count (" << pSomeClass->getRefCount() << ") outer 2."<< std::endl;
// delete pSomeClass ; 不需要也不能执行delete操作!

std::cout << "new another SomeClass class for spOuter."<< std::endl;
SmartPointer<SomeClass> spOuter2 = new SomeClass();
spOuter = spOuter2;// 1处new出来的SomeClass将会被自动释放
}

int main(void)
{
testcase3();
return 0;
}



原文:https://www.shiyanlou.com/courses/745/labs/2505/document
...全文
496 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
bandaoyu 2018-12-18
  • 打赏
  • 举报
回复
引用 2 楼 Saleayas 的回复:
因为这是模板啊,在模板具体化之前仅仅检测语法,只有在具体化的时候才会检测其他的。 比如你说的 T 时候具有某个成员函数等等。
“因为这是模板啊,在模板具体化之前仅仅检测语法,只有在具体化的时候才会检测其他的。”嗦嘎,秒懂。 另外面试了很多家,还是第一次被问到C++中4种强制类型转换,当时完全没概念。在很多的面试题材料上没看到过,感觉使用的不太多。 请问用得多吗? 因为时间很赶,还有很多C++的知识需要复习,所以如果不多的话,我就不复习这个内容了,毕竟虽然看上去内容不多,不过要理解起来还是要费不少功夫。 https://www.jb51.net/article/99814.htm
zhouqunhai 2018-12-18
  • 打赏
  • 举报
回复
项目上实际用的不多,一般面试会问到
  • 打赏
  • 举报
回复
引用 3 楼 bandaoyu 的回复:
[quote=引用 2 楼 Saleayas 的回复:] 因为这是模板啊,在模板具体化之前仅仅检测语法,只有在具体化的时候才会检测其他的。 比如你说的 T 时候具有某个成员函数等等。
“因为这是模板啊,在模板具体化之前仅仅检测语法,只有在具体化的时候才会检测其他的。”嗦嘎,秒懂。 另外面试了很多家,还是第一次被问到C++中4种强制类型转换,当时完全没概念。在很多的面试题材料上没看到过,感觉使用的不太多。 请问用得多吗? 因为时间很赶,还有很多C++的知识需要复习,所以如果不多的话,我就不复习这个内容了,毕竟虽然看上去内容不多,不过要理解起来还是要费不少功夫。 https://www.jb51.net/article/99814.htm[/quote] C++推荐使用四钟转换方式。也可以用C的强制转换。
bandaoyu 2018-12-18
  • 打赏
  • 举报
回复
引用 6 楼 zgbzsu2008 的回复:
编译的时候会把模板实例化,就会检测的到有没有
所噶!!!!!! 秒懂! 感谢
AlbertS 2018-12-18
  • 打赏
  • 举报
回复
引用 6 楼 zgbzsu2008 的回复:
编译的时候会把模板实例化,就会检测的到有没有
+1
zgbzsu2008 2018-12-18
  • 打赏
  • 举报
回复
编译的时候会把模板实例化,就会检测的到有没有
Saleayas 2018-12-17
  • 打赏
  • 举报
回复
因为这是模板啊,在模板具体化之前仅仅检测语法,只有在具体化的时候才会检测其他的。 比如你说的 T 时候具有某个成员函数等等。
bandaoyu 2018-12-16
  • 打赏
  • 举报
回复
我好像明白了, template <typename T> private: T *mPointer; // 指向智能指针实际对应的内存资源,根据参数自动推导规则,定义内部资源指针类型 T表示要指向的类的类型,而指向的类的类型只要继承 class RefBase  ,那么mPointer就有 RefBase的方法了。 问题是 C++ 还不知道T 是什么,就可以让mPointer->incRefCount()了,要是 传进来的 T 不具备这个incRefCount方法,是不是在用实例的时候就会报错?

64,641

社区成员

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

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