16 Kasım 2011, ÇARŞAMBA
Nasıl diyebilir miyim ::std::make_shared yalnızca korumalı veya özel kurucular içeren bir sınıf.
Bu işe yaramazsa bu kodu var, ama niyetin açık olduğunu düşünüyorum
testmakeshared.cpp
#include <memory>
class A {
public:
static ::std::shared_ptr<A> create() {
return ::std::make_shared<A>();
}
protected:
A() {}
A(const A &) = delete;
const A &operator =(const A &) = delete;
};
::std::shared_ptr<A> foo()
{
return A::create();
}
Ama ben derlerken bu hatayı alıyorum:
g -std=c 0x -march=native -mtune=native -O3 -Wall testmakeshared.cpp
In file included from /usr/lib/gcc/x86_64-redhat-linux/4.6.1/../../../../include/c /4.6.1/bits/shared_ptr.h:52:0,
from /usr/lib/gcc/x86_64-redhat-linux/4.6.1/../../../../include/c /4.6.1/memory:86,
from testmakeshared.cpp:1:
testmakeshared.cpp: In constructor ‘std::_Sp_counted_ptr_inplace<_Tp, _Alloc, _Lp>::_Sp_counted_ptr_inplace(_Alloc) [with _Tp = A, _Alloc = std::allocator<A>, __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]’:
/usr/lib/gcc/x86_64-redhat-linux/4.6.1/../../../../include/c /4.6.1/bits/shared_ptr_base.h:518:8: instantiated from ‘std::__shared_count<_Lp>::__shared_count(std::_Sp_make_shared_tag, _Tp*, const _Alloc&, _Args&& ...) [with _Tp = A, _Alloc = std::allocator<A>, _Args = {}, __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]’
/usr/lib/gcc/x86_64-redhat-linux/4.6.1/../../../../include/c /4.6.1/bits/shared_ptr_base.h:986:35: instantiated from ‘std::__shared_ptr<_Tp, _Lp>::__shared_ptr(std::_Sp_make_shared_tag, const _Alloc&, _Args&& ...) [with _Alloc = std::allocator<A>, _Args = {}, _Tp = A, __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]’
/usr/lib/gcc/x86_64-redhat-linux/4.6.1/../../../../include/c /4.6.1/bits/shared_ptr.h:313:64: instantiated from ‘std::shared_ptr<_Tp>::shared_ptr(std::_Sp_make_shared_tag, const _Alloc&, _Args&& ...) [with _Alloc = std::allocator<A>, _Args = {}, _Tp = A]’
/usr/lib/gcc/x86_64-redhat-linux/4.6.1/../../../../include/c /4.6.1/bits/shared_ptr.h:531:39: instantiated from ‘std::shared_ptr<_Tp> std::allocate_shared(const _Alloc&, _Args&& ...) [with _Tp = A, _Alloc = std::allocator<A>, _Args = {}]’
/usr/lib/gcc/x86_64-redhat-linux/4.6.1/../../../../include/c /4.6.1/bits/shared_ptr.h:547:42: instantiated from ‘std::shared_ptr<_Tp1> std::make_shared(_Args&& ...) [with _Tp = A, _Args = {}]’
testmakeshared.cpp:6:40: instantiated from here
testmakeshared.cpp:10:8: error: ‘A::A()’ is protected
/usr/lib/gcc/x86_64-redhat-linux/4.6.1/../../../../include/c /4.6.1/bits/shared_ptr_base.h:400:2: error: within this context
Compilation exited abnormally with code 1 at Tue Nov 15 07:32:58
Bu mesaj bu temelde rastgele bir yöntem şablon oluşturma içinde aşağıya ::std::make_shared
yığın korunuyor çünkü kurucu erişemez söylüyor.
Ama gerçekten ::std::make_shared
hem kullanmak ve ::std::shared_ptr
bir işaret olmadığını, bu sınıfın bir nesnesi yapmaktan kimseye önlemek istiyoruz. Bunu yapmak için herhangi bir yolu var mı?
CEVAP
16 Kasım 2011, ÇARŞAMBA
This answer muhtemelen daha iyi, ve büyük ihtimalle kabul edeceğim. Ama ben de çirkin bir yöntem ile geldi, ama yine de her şey hala içi ve türetilmiş bir sınıf gerektirmez izin verir:
#include <memory>
class A {
struct this_is_private {
};
public:
explicit A(const this_is_private &) {}
static ::std::shared_ptr<A> create() {
return ::std::make_shared<A>(this_is_private{});
}
protected:
A(const A &) = delete;
const A &operator =(const A &) = delete;
};
::std::shared_ptr<A> foo()
{
return A::create();
}
Bunu Paylaş:
Nasıl js veya jQuery ile ajax isteği i...
Nasıl doğrudan test sürücüsü özel Djan...
Nasıl özel bir Yazı karakteri ile Type...
Nasıl özel yöntemleri, alanları veya i...
Nasıl bir dizin C veya C kullanarak do...