c – 构造函数Foo :: Foo接收对Foo的引用但不接受copy-constructor

c – 构造函数Foo :: Foo接收对Foo的引用但不接受copy-constructor,第1张

概述假设我有一个不可复制的类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    ...};

编译器认为这是一个复制构造函数,
虽然它做了一些与复制完全无关的事情(因此禁用了赋值运算符).

以这种方式定义构造函数是否有任何危险,
或者我应该人为改变其签名,例如使用指针而不是引用,
或添加一个必需的虚拟参数?

这是一些背景(可能不需要理解/回答我的问题).

我有一个我自己编写的类库,
它用作用户代码和另一个库之间的连接.
另一个库提供了一个服务,我称之为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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1213352.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存