March 12, 2005 Enforce new? | ||||
---|---|---|---|---|
| ||||
Hello. I want to forbid for some of my classes to be instantiated on the stack - because the constructor stores the this pointer immediately in a searchable static container and the objects need to keep alive for most of the duration of the program. Are there any ideomatic means of doing that? If that's not a oneliner, i would think that this might be a valuable addition to stlsoft libraries. -eye |
March 12, 2005 Re: Enforce new? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ilya Minkov | Hide the ctor and use a Create method (with the same signature as the ctor). I use this fairly regularly. Unfortunately, it's almost impossible to get a workable generic version with the current language, due to the hassles with const/pointer/reference/value differences with argument forwarding (as described in Chapter 23 of your copy of IC++). The upside is that it is a nice point at which to introduce shims into the construction process, which can simplify client code a great deal. Here's a snippet from a recent project (with names changed to protect client's IP): class BaseClass; . . . class Auditor; class Handler; . . . typedef ::stlsoft::shared_ptr<BaseClass> BaseClass_ptr; . . . class SomeClass : public BaseClass { /// \name Types /// @{ public: typedef BaseClass parent_class_type; typedef SomeClass class_type; /// @} /// \name Construction /// @{ private: /// Default constructor SomeClass( Handler *handler , char const *processIdentity , char const *channelIdentity , char const *auditPoint , Auditor &auditor); public: /// Destructor ~SomeClass(); static BaseClass_ptr CreateInstance( Handler *handler , char const *processIdentity , char const *channelIdentity , char const *auditPoint , Auditor &auditor); template <typename S1, typename S2, typename S3> static BaseClass_ptr CreateInstance( Handler *handler , S1 const &processIdentity , S2 const &channelIdentity , S3 const &auditPoint , Auditor &auditor) { return class_type::CreateInstance( handler , ::stlsoft::c_str_ptr(processIdentity) , ::stlsoft::c_str_ptr(channelIdentity) , ::stlsoft::c_str_ptr(auditPoint) , auditor); } /// @} . . . }; Thus, one can call CreateInstance() with any types for which string access shims are defined and available. In this case, the instance is passed into a shared_ptr, but this 'idiom' (if it qualifies as an idiom) works just as well returning pointers, should that be appropriate. "Ilya Minkov" <minkov@cs.tum.edu> wrote in message news:d0v9cl$1i3$1@digitaldaemon.com... > Hello. > > I want to forbid for some of my classes to be instantiated on the stack - because the constructor stores the this pointer immediately in a searchable static container and the objects need to keep alive for most of the duration of the program. > > Are there any ideomatic means of doing that? > > If that's not a oneliner, i would think that this might be a valuable addition to stlsoft libraries. > > -eye |
Copyright © 1999-2021 by the D Language Foundation