gpt4 book ai didi

c++ - 构造函数 Foo::Foo 接收到对 Foo 的引用但不是复制构造函数

转载 作者:太空狗 更新时间:2023-10-29 20:18:13 35 4
gpt4 key购买 nike

假设我有一个不可复制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 的引用但不是复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4774257/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com