析构函数可以是private成员吗?

FishCrazy 2005-06-07 09:48:47
我知道通过限定构造函数为private成员可以避免在外部创建实例,但是析构呢?

比如
class G
{
private:
G();
virtual ~G();
};

G如果只是作为一个全局指针,而不会成为其他对象的成员,这样的话,析构函数是不是就可以
作为private存在?
...全文
1017 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
jingyueid 2005-06-07
  • 打赏
  • 举报
回复
1.使用析构函数后,不能在栈上创建类,需要使用相应的销毁函数来完成,例如:
class A
{
~A(); //A can not created on the stack.
public:
static A* CraeteInstance(); //生成一个堆上的A
static void ReleaseInstance(A*);//释放A
}

2.保护作用域,只能被友元类访问到,就像JAVA里面的匿名类一样。

#include <iostream>
using namespace std;

class B;

class A
{
friend class B;
~A() {}
public:
void show(void) const { cout << "A::Show(void)" << endl; }
};

class B
{
public:
void func() const
{
A a;
a.show();
}
};


int main(void)
{
B b;
b.func();

// A a; Error!!!
// a.show(); Error!!!
return 0;
}
lalalalala 2005-06-07
  • 打赏
  • 举报
回复
class obj
{
private:
obj();
~obj();
// maintain a static obj pool
public:
...
static obj& get(){...}
static obj* getHandle() {...}
static void dispose(obj& o) {...}
static void dispose(obj* oh) {...}
};
lalalalala 2005-06-07
  • 打赏
  • 举报
回复
class objpool;
class obj
{
private:
obj();
~obj();
public:
...
friend class objpool;
};

class objpool
{
init()
{
// instantialize objs and put into a pool
}
public:
obj& get(){...}
obj* getHandle() {...}
void dispose(obj& o) {...}
void dispose(obj* oh) {...}
};
lalalalala 2005-06-07
  • 打赏
  • 举报
回复
一种方式是通过友元来控制构造和析构,另一种就是通过静态函数控制构造和析构。其实两种方式的目的都是一样的:不让用户自己控制对象的生存周期,而是通过预先设计的方式来控制。对象池就是一个例子:从对象池获得对象和归还对象到对象池都是通过接口来实现,用户不用关心对象的构造和析构。把构造和析构设为private可以从编译的角度避免用户绕过系统提供的机制控制对象的生存周期
hzhxxx 2005-06-07
  • 打赏
  • 举报
回复




http://community.csdn.net/Expert/topic/4064/4064676.xml?temp=.4853022

大家看看这个问题,有价值一下啊
willko 2005-06-07
  • 打赏
  • 举报
回复
MEC++中有个把构造函数声明为私有的例子,这样可以控制类的对象个数
yjh1982 2005-06-07
  • 打赏
  • 举报
回复
让析构函数为私有,可以强制用户只能动态创建该类.
再调用其它函数(比如友元)释放它.

xzgyb 2005-06-07
  • 打赏
  • 举报
回复
mccxj:
呵呵,有点那意思,永远不让释放

一般把所有成员作为私有的,都是作为一种实现类
然后设置一下友元类,被别的类使用
darkstar21cn 2005-06-07
  • 打赏
  • 举报
回复
可以,但是你得给它一个自己的“析构函数”
比如ACE里面就有这么使用的。

一般情况下,是把析构函数设成protected,让派生类来释放它。
「已注销」 2005-06-07
  • 打赏
  • 举报
回复
事实上如果只让析构函数为私有的感觉没什么用
允许外部创建,但又不让释放,呵呵
有点难受
--------------------------
就象当年金山淘金。。呵呵。。去的话无任欢迎。。想回来。。想都别想。。。
xzgyb 2005-06-07
  • 打赏
  • 举报
回复
事实上如果只让析构函数为私有的感觉没什么用
允许外部创建,但又不让释放,呵呵
有点难受
FishCrazy 2005-06-07
  • 打赏
  • 举报
回复
像上面的写法是不能够编译通过的,但是如果
...
private:
G* pG;
...

的话,是可以编译过的
「已注销」 2005-06-07
  • 打赏
  • 举报
回复
class A
{
public:
A();
virtual ~A();

private:
G InstG;//析构的时候,InstG调用析构函数,但是析构函数是私有的,好像看语法的话好像不可以访问哦。。
};

调用A的析构函数之前,必然会调用G的析构函数,如果这个时候,G的析构是private的话,会出现什么情况呢?
xzgyb 2005-06-07
  • 打赏
  • 举报
回复
试试不就知道了吗
停在virtual ~A()处
错误:
'G::~G' : cannot access private member declared in class 'G'
junguo 2005-06-07
  • 打赏
  • 举报
回复
应该不会有问题吧!
FishCrazy 2005-06-07
  • 打赏
  • 举报
回复
构造可以肯定没有限制,但是如果这样

class A
{
public:
A();
virtual ~A();

private:
G InstG;
};

调用A的析构函数之前,必然会调用G的析构函数,如果这个时候,G的析构是private的话,会出现什么情况呢?
「已注销」 2005-06-07
  • 打赏
  • 举报
回复
??构造和析构好像没有限制的把。
mostideal 2005-06-07
  • 打赏
  • 举报
回复
少用的就少想了。。

64,644

社区成员

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

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