gpt4 book ai didi

c++ - 当一个类包含另一个类的实例时的类设计

转载 作者:搜寻专家 更新时间:2023-10-31 00:57:00 25 4
gpt4 key购买 nike

我举下面的例子来说明我的问题。假设 Abc 是一个将使用另一个类 (Def) 的类。假设 Def 是一个有很多类成员的大类(复制成本高),让指向 Def 对象的指针成为 Abc 类的一部分更有意义。然后在实现Abc类函数do1时,可以通过指针pDef来引用Def对象。

class Abc
{
public:
Abc(Def &def)
{
pDef = &def;
}
~Abc()
{
}
void do1();
private:
Def *pDef;

}

但是,如果我以这种方式实现类 Abc,我将面临 Def 指针可能无效的风险。关于改进此类设计的任何想法?我的一个想法是使用共享指针:

 class Abc
{
public:
Abc(boost::shared_ptr<Def> def)
{
pDef = def;
}
~Abc()
{
}
void do1();
private:
boost::shared_ptr<Def> pDef;

}

编辑:我想说明一下,我的主要目的是在构造类 Abc 时避免昂贵的复制操作。对我来说,使用共享指针和 James Adkison 的解决方案(接受的答案)都可以解决问题。但是对昂贵的 Def 对象的影响可能不同。使用共享指针将保留多个对象拷贝,而使用 James Adkison 的解决方案将只保留一份 Def 对象。

最佳答案

Assume Def is a large class with many class members

我假设这意味着复制 Def 类的成本很高。但是,使用 C++11,您可以为 Def 实现移动语义,并保持 Abc 实现简单高效。

注意:此答案基于以下假设:问题使用任何指针(智能或其他)的唯一原因是为了避免昂贵的拷贝。

示例代码

class Def
{
public:
Def() {}
Def(const Def& other) { /* ... */ } // Copy constructor even though it's expensive
Def(Def&& other) { /* ... */ } // Move constructor for efficiency

Def& operator=(const Def& other) { /* ... */ } // Copy assignment
Def& operator=(Def&& other) { /* ... */ } // Move assignment
};

现在 Def 类支持复制语义,即使复制该类可能很昂贵。但是,它还支持移动语义,以便在不需要拷贝时高效使用。

class Abc
{
public:
Abc() {}

Abc(const Def& def) : mDef(def) {} // Perform an expensive copy

Abc(Def&& def) : mDef(std::move(def)) {} // Perform a move

// Implement any other member functions which could accept Def
// via copy or move

private:
Def mDef;
};

如果用例实际上是为了支持共享所有权语义,我只会提倡使用 std::shared_ptr

关于c++ - 当一个类包含另一个类的实例时的类设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38204671/

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