c – 构造函数Foo :: Foo接收对Foo的引用但不接受copy-construct
发布时间:2020-12-16 09:31:53 所属栏目:百科 来源:网络整理
导读:假设我有一个不可复制的类Foo, 其中一个构造函数恰好接收了对Foo的引用. class Foo{public: Foo(Foo parent) {...}private: void operator=(Foo); // disabled ...}; 编译器认为这是一个复制构造函数, 虽然它做了一些与复制完全无关的事情(因此禁用了赋值运
假设我有一个不可复制的类Foo,
其中一个构造函数恰好接收了对Foo的引用. class Foo { public: Foo(Foo& parent) {...} private: void operator=(Foo); // disabled ... }; 编译器认为这是一个复制构造函数, 以这种方式定义构造函数是否有任何危险, 这是一些背景(可能不需要理解/回答我的问题). 我有一个我自己编写的类库, class UsefulObject: public mylib::Frobnicator { ... void DoStuff() { int x = ... ... frobnicate(x); // it's important to allow simple syntax here frobnicate(x + 1); ... } ... }; 我想支持用户对象的层次结构:每个对象都包含在另一个对象(其父对象)中, 每个对象都有一个日志文件;我希望每个调用都记录在几个日志文件中, 我用这种方式实现了它: namespace mylib { class Frobnicator // provides the frobnication service { public: Frobnicator(Frobnicator& parent): parent(parent) {} protected: virtual void frobnicate(int x) { ... // some logging code parent->frobnicate(x); } private: Frobnicator& parent; }; namespace internal // users of mylib,please don't use this! { class TheUltimateFrobnicator: public Frobnicator { protected: virtual void frobnicate(int x) { the_other_library::frobnicate(x); } private: TheUltimateFrobnicator(int id); // called by a factory or some such }; } } 解决方法
这似乎是这种构造函数意义上的一个不幸的模糊.我认为消除歧义的最直接的方法是使用指针
class Frobnicator // provides the frobnication service { public: explicit Frobnicator(Frobnicator *parent): parent(parent) {} protected: virtual void frobnicate(int x) { ... // some logging code parent->frobnicate(x); } private: void operator=(Foo); // disabled Frobnicator(Frobnicator const&); // disabled Frobnicator *parent; }; 我知道很多人都希望参数成为指针.顺便说一下,你自己错误地将parent.frobnicate输入为parent-> frobnicate. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |