加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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
    ...
};

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读