这是一个设计问题。我正在工作一个复杂的客户端-服务器体系结构,其中几个模块(始终在线程中运行)是相互依赖的,并且经常相互交换信息。在代码中只有一个入口点可以创建所有模块。在代码的早期,当模块较少时,通过创建和定义它们之间的关系,我没有任何问题。这是一个例子:
auto module1 = std::make_shared<Module1>();
auto module2 = std::make_shared<Module2>(module1);
auto module3 = std::make_shared<Module3>(module1);
auto module4 = std::make_shared<Module4>(module1, module3);
//and so on and so forth
随着模块数量的增加,有必要使模块成为课程的一部分。这样,我们可以在创建模块B之前在模块A中引用模块B。这种方法的问题在于仅头文件中的声明是不够的。因为在通过std :: make_shared创建模块的那一刻,通过另一个共享指针对其进行引用的模块会松开该引用。因此,此代码将不起作用:
m_module1 = std::make_shared<Module1>(m_module2);
m_module2 = std::make_shared<Module2>();
在整个代码中都使用了std :: shared_ptr,因此我无法将其更改为其他内容。我需要另一种方法来解决这个问题。
关于如何实现这一点的任何想法?
这是一个更简单的解决方案。假设我们有一个Car类,该类在其构造函数中带有Wheel对象。我们声明Wheel对象,但不进行初始化。然后,我们通过传递对Wheel对象的引用来初始化Car对象。然后,我们创建wheel对象。由于Car将Wheel存储为指向std :: shared_ptr的指针,因此有可能:
class Wheel
{
private:
int m_diameter;
public:
Wheel(int diameter) : m_diameter(diameter)
{
}
int GetDiameter()
{
return m_diameter;
}
};
class Car
{
private:
int m_startSpeed;
std::shared_ptr<Wheel> *m_wheel;
public:
Car(int startSpeed, std::shared_ptr<Wheel>* wheel)
: m_startSpeed(startSpeed), m_wheel(wheel)
{
}
void Accelerate(int delta)
{
m_startSpeed += delta;
}
int GetDiameter()
{
return (*m_wheel)->GetDiameter();
}
};
int _tmain(int argc, _TCHAR* argv[])
{
std::shared_ptr<Wheel> wheel;
auto car = std::make_shared<Car>(10, &wheel);
wheel = std::make_shared<Wheel>(50);
int wheelDiameter = car->GetDiameter();
return 0;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句