其中一个构造函数恰好接收了对Foo的引用.
class Foo{public: Foo(Foo& parent) {...}private: voID operator=(Foo); // Disabled ...};
编译器认为这是一个复制构造函数,
虽然它做了一些与复制完全无关的事情(因此禁用了赋值运算符).
以这种方式定义构造函数是否有任何危险,
或者我应该人为改变其签名,例如使用指针而不是引用,
或添加一个必需的虚拟参数?
这是一些背景(可能不需要理解/回答我的问题).
我有一个我自己编写的类库,
它用作用户代码和另一个库之间的连接.
另一个库提供了一个服务,我称之为frobnicate为简洁.
用户代码可能如下所示:
class UsefulObject: public mylib::Frobnicator{ ... voID DoStuff() { int x = ... ... frobnicate(x); // it's important to allow simple Syntax here frobnicate(x + 1); ... } ...};
我想支持用户对象的层次结构:每个对象都包含在另一个对象(其父对象)中,
虽然有一些(在我的情况下,5个)包含所有其他对象的顶级对象.
每个对象都有一个日志文件;我希望每个调用都记录在几个日志文件中,
收容层次结构直到顶级对象.
我用这种方式实现了它:
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.
总结以上是内存溢出为你收集整理的c – 构造函数Foo :: Foo接收对Foo的引用但不接受copy-constructor全部内容,希望文章能够帮你解决c – 构造函数Foo :: Foo接收对Foo的引用但不接受copy-constructor所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)