1

以下两个示例之间是否有任何区别,是否应该首选一个示例而不是其他示例:

示例 1:

class A
{
    int i;
    B* b;

    do_something();
    do_something_else();
}

A::do_something()
{    
    do_something_else();
}

示例 2:

class A
{
    int i;

    do_something()
    do_something_else(B* b)
}

A::do_something()
{
    B* b;
    do_something_else(b);
}

现在假设有几种方法使用b是让它们都将它作为参数还是不带参数并使用成员变量更好?两种方法的性能有区别吗?我可以看到两者的好处,但哪个更受欢迎?

4

4 回答 4

12

如果变量属于您正在设计的对象,请使其成为成员。如果您只使用临时变量 - 不要让它们成为成员,因为在这种情况下您只会污染您的对象设计

于 2012-06-21T10:03:57.853 回答
8

这实际上归结为您的对象模型如何组合在一起,以及聚合关系是否准确地代表了您希望建模的内容。

想想B在你的情况下是否真的表现出与的关系A(即说A has-a B是真的吗?)例如,在大多数情况下,汽车引擎,因此引擎可以合理地由以下人员拥有/包含一辆车。如果是这种情况,那么您可能应该使用示例 1。

另一方面,如果没有直接关系,A只是需要对另一个对象采取行动而不拥有或包含它,那么您应该坚持使用示例 2。例如:

Dog myDog;
Stick aStick;
myDog.fetches(aStick);

显然,一根棍子(希望)不是狗的组成部分。

为了方便起见,将变量(尤其是指针)合并到类中并让代码看起来更好(即因为您不必传递这么多参数)是很诱人的,但是如果包含的对象与容器没有很强的关系和/或在其他地方进行管理,您经常会遇到复杂的生命周期管理问题,这可能会抵消您最初试图从聚合中获得的好处。

于 2012-06-21T10:23:32.613 回答
3

适合的那一款是首选。

如果类实例应该拥有指针指向的对象,那么它应该是成员变量。如果它只是函数的参数,而不是由 object 拥有,那么不要让它成为成员。

于 2012-06-21T10:04:13.143 回答
2

使用聚合/组合(将变量作为成员),因为您需要在函数调用之间维护状态

虽然有关对象模型的建议是合理的,但您经常会偶然发现您拥有纯制造类的情况,并且“has-a”和“is-a”不再有意义了。

如果你一直无视这个建议,它就会付出代价。

  • 对象大小变大,当您选择复制对象时,这将影响您的内存和性能。

  • 您传达该成员是对象状态的一部分,这意味着其他开发人员(请记住,几周后您也是“其他开发人员”)在尝试找出该对象如何成为对象状态的一部分时会感到困惑.

  • 您需要知道 header 中的成员大小,这是头文件中的额外包含,保持这种做法,当您更改基本头中的一行时,您将编译数周。您只希望标题中包含最少数量的包含。

所以不要使用这种技术来减少参数的数量。(请记住,没有绝对的真理)

于 2012-06-21T10:44:41.233 回答