基本上,我有一个拥有另一个对象的类:
class A()
{
A() { initSystems() };
void initSystems();
B b;
}
class B()
{
B() { //Does stuff that requires 'initSystems()' to be called before }
}
并且要使“B”运行,需要在A中调用init系统函数。有没有“好的”方法来解决这个问题?比如稍后创建'B'对象还是什么?
答案 0 :(得分:4)
听起来你的课程太tightly coupled了。有很多方法可以解决这个问题,但这取决于你的其他设计。
也许A不应该拥有B,因为A是B的依赖关系。在实例化每个B时,你可以inject一个A的实例。
也许B不应该存在,而且它应该合并到A:
class A()
{
A() {
initSystems();
//Does stuff that requires 'initSystems()' to be called before
}
void initSystems();
// B's methods
}
我认为大多数初始化方法都是代码味道(也就是说,它表明设计不好)。有些人给这个模式起了一个名字:"Design Smell: Temporal Coupling"
答案 1 :(得分:3)
如果你想让B成为A的正式成员,你可以在构建hssfSheet.setAutoFilter(new CellRangeAddress(2, 4, 6, 3));
hssfSheet.setAutoFilter(new CellRangeAddress(8, 5, 3, 5));
之前运行代码的两个地方是:
b
上面声明的成员。如果您希望推迟构建B,您需要通过间接保留对象或稍后将其构建到原始存储上,并在销毁时执行放置销毁。
其中大部分都有奇怪的气味,重新组织代码以避免这种结构可能是有益的。
答案 2 :(得分:1)
您只需更改设计,因此initSystems()
和A
都需要B
。
如果你不能这样做(尽管你真的应该这样做),还有其他方法,比如动态分配:
class A()
{
A() {
initSystems();
b = std::make_unique<B>();
};
void initSystems();
std::unique_ptr<B> b;
}
答案 3 :(得分:0)
我同意@nanny对类的解耦和合并(如果可能的话)。
但是您的场景似乎是B在您的系统中是独立的实体,因此是一个类。 A 包含 B ,因此包含<。
因此解决这个问题的一种方法是,在A中保留B的引用(指针),而不是将B作为A的一部分。
或者你不应该在B的构造函数中访问在A的initInstance()中创建的东西,并在B中创建一个方法postConstruct,你可以在调用initInstance后从A调用它。以下代码解释了它,
class A()
{
A()
{
initSystems();
b.postContruct()
}
void initSystems()
{
// do the init instance stuff here.
}
B b;
}
class B()
{
B() {}
void postContruct()
{
//Does stuff that requires 'initSystems()' to be called before
}
}