M********5 发帖数: 715 | 1 怎么样才能prevent类在stack上instantiation,而只能在heap上instantiation |
t******e 发帖数: 1293 | 2 placement new?
【在 M********5 的大作中提到】 : 怎么样才能prevent类在stack上instantiation,而只能在heap上instantiation
|
p**********s 发帖数: 115 | 3 private destructor.
so that if the class is on stack, when it's out of scope, error will be
thrown since destructor is private.
【在 M********5 的大作中提到】 : 怎么样才能prevent类在stack上instantiation,而只能在heap上instantiation
|
M********5 发帖数: 715 | |
M********5 发帖数: 715 | 5
Then I have one question. How do you delete the object?
【在 p**********s 的大作中提到】 : private destructor. : so that if the class is on stack, when it's out of scope, error will be : thrown since destructor is private.
|
J******e 发帖数: 225 | 6 应该是copy ctor吧
【在 t******e 的大作中提到】 : placement new?
|
d********e 发帖数: 132 | 7 void test
{
B b; // create local auto object on the stack
B* bp = new B() // create object on the heap & have bp refer to it
delete bp; // manually delete object that bp refers to
}
【在 M********5 的大作中提到】 : 怎么样才能prevent类在stack上instantiation,而只能在heap上instantiation
|
l*******o 发帖数: 791 | 8 class Simple{
private:
static Simple * ptr;
string name;
Simple();
public:
static Simple * createSimple(){ptr = new Simple(); return ptr;}
const string getName(){return name;}
};
Simple* Simple:: ptr = NULL;
Simple::Simple(): name("mitbbs"){}
//static Simple* Simple::createSimple(){ ptr = new Simple; return ptr;}
void func()
{
Simple *s= Simple::createSimple();
cout<getName()<
}
int |
l*****a 发帖数: 559 | 9 这个想法不错。
弄得有点像singleton的getinstance去除mutex了。
ptr;}
【在 l*******o 的大作中提到】 : class Simple{ : private: : static Simple * ptr; : string name; : Simple(); : public: : static Simple * createSimple(){ptr = new Simple(); return ptr;} : const string getName(){return name;} : }; : Simple* Simple:: ptr = NULL;
|
l******e 发帖数: 12192 | 10 a static function to delete
【在 M********5 的大作中提到】 : : Then I have one question. How do you delete the object?
|
|
|
l*******o 发帖数: 791 | 11 想法不错就是还是不对么?
【在 l*****a 的大作中提到】 : 这个想法不错。 : 弄得有点像singleton的getinstance去除mutex了。 : : ptr;}
|
M********5 发帖数: 715 | 12
it
你根本就没有搞懂我的意思,我的意思是阻止在stack上实例化。。。。你这么写,这个
B b;
依然是在stack上创建的
【在 d********e 的大作中提到】 : void test : { : B b; // create local auto object on the stack : B* bp = new B() // create object on the heap & have bp refer to it : : delete bp; // manually delete object that bp refers to : }
|
M********5 发帖数: 715 | 13 以上各位的答案,我觉得有两个是正确的
一个就是private destructor,然后在类里面写一个函数,delete掉创建的对象
一个就是上面luhonghao写的,不过这个的实现确实是singleton的实现 |
l*******o 发帖数: 791 | 14 我这个还不算singleton,因为singleton要检查是否static指针指空。我这个有点像
simple
factory pattern.大家说呢?
【在 M********5 的大作中提到】 : 以上各位的答案,我觉得有两个是正确的 : 一个就是private destructor,然后在类里面写一个函数,delete掉创建的对象 : 一个就是上面luhonghao写的,不过这个的实现确实是singleton的实现
|
l*****a 发帖数: 559 | 15 一点也没这个意思。
刚看到的时候感觉被inspire了。
【在 l*******o 的大作中提到】 : 想法不错就是还是不对么?
|
l*******y 发帖数: 1498 | 16 private destructor还是可以在stack上instantiation吧,只是不能直接destruct?
【在 M********5 的大作中提到】 : 以上各位的答案,我觉得有两个是正确的 : 一个就是private destructor,然后在类里面写一个函数,delete掉创建的对象 : 一个就是上面luhonghao写的,不过这个的实现确实是singleton的实现
|
z***9 发帖数: 696 | 17 private ctor and public function to create objects in heap |
t****t 发帖数: 6806 | 18 no, if you try instantiate on stack, the destructor call will be generated
implicitly and you can not compile at all.
【在 l*******y 的大作中提到】 : private destructor还是可以在stack上instantiation吧,只是不能直接destruct?
|
l*******y 发帖数: 1498 | 19 确实,刚试过了。不能编译。如果new 然后直接delete编译也会报错,只能自己定义一个static
member function 或者一个 friend function 来 delete,然后调用这些function来完
成delete.
【在 t****t 的大作中提到】 : no, if you try instantiate on stack, the destructor call will be generated : implicitly and you can not compile at all.
|
h**k 发帖数: 3368 | 20
;}
不需要静态指针ptr,直接return new Simple()就可以了。
【在 l*******o 的大作中提到】 : class Simple{ : private: : static Simple * ptr; : string name; : Simple(); : public: : static Simple * createSimple(){ptr = new Simple(); return ptr;} : const string getName(){return name;} : }; : Simple* Simple:: ptr = NULL;
|
h**6 发帖数: 4160 | 21 我试了一下,定义一个这样的函数也可以完成销毁变量,大家看看行不行:
void destroy(){this->~A();}
其中 A 是类名。
一个static
【在 l*******y 的大作中提到】 : 确实,刚试过了。不能编译。如果new 然后直接delete编译也会报错,只能自己定义一个static : member function 或者一个 friend function 来 delete,然后调用这些function来完 : 成delete.
|
M********5 发帖数: 715 | 22 这样是没有问题的
【在 h**6 的大作中提到】 : 我试了一下,定义一个这样的函数也可以完成销毁变量,大家看看行不行: : void destroy(){this->~A();} : 其中 A 是类名。 : : 一个static
|