ana*_*lyg 3 c++ copy-constructor chain-of-responsibility
假设我有一个不可复制的类Foo,其中一个构造函数恰好接收了对它的引用Foo.
class Foo
{
public:
Foo(Foo& parent) {...}
private:
void operator=(Foo); // disabled
...
};
Run Code Online (Sandbox Code Playgroud)
编译器认为这是一个复制构造函数,而它完成与复制完全无关的事情(因此禁用赋值运算符).
以这种方式定义构造函数是否存在任何危险,或者我应该人为地更改其签名,例如使用指针而不是引用,还是添加必需的伪参数?
这是一些背景(可能不需要理解/回答我的问题).
我有一个我自己编写的类库,它用作用户代码和另一个库之间的连接.另一个库提供了一个服务,我称之为frobnicate为简洁.用户代码可能如下所示:
class UsefulObject: public mylib::Frobnicator
{
...
void DoStuff()
{
int x = ...
...
frobnicate(x); // it's important to allow simple syntax here
frobnicate(x + 1);
...
}
...
};
Run Code Online (Sandbox Code Playgroud)
我想支持用户对象的层次结构:每个对象都包含在另一个(其父对象)中,而有一些(在我的情况下,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
};
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎是这种构造函数意义上的一个不幸的模糊.我认为消除歧义的最直接的方法是使用指针
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;
};
Run Code Online (Sandbox Code Playgroud)
我知道很多人都希望参数成为指针.顺便说一下,你自己错parent.frobnicate了parent->frobnicate.