【问题标题】:Where to place common function which will be used by class and class member?在哪里放置类和类成员将使用的公共函数?
【发布时间】:2018-06-07 16:35:46
【问题描述】:

例如,

class B {
  int* b1;
  int* b2;
  B(int* x, int* y) {
     b1 = x;
     b2 = y;
  }

};

class A {
  int* a1;
  int* a2;
  B* b1;
  public:
  A() {
    a1 = new int;
    a2 = new int;
    b1 = new B1(a1, b1);
  }
};

我想从 A 类和 B 类的对象中访问 a1 和 a2 所指向的值。我应该在哪里编写相同的函数,以便该函数可以被 A 的对象和 B 的对象调用。?

【问题讨论】:

  • 我认为您正在寻找继承,而不是聚合。
  • @Yksisarvinen 不,我需要向类成员传递一些值,这个类成员再次需要来自主类的少量值并且有一些不同的目的。
  • 真的不清楚你在问什么。
  • “功能嫉妒”在这里闻起来很香。我建议重新考虑这些类的设计。他们为什么要共享资源?
  • 这对我来说就像XY problem。

标签: c++ methods composition


【解决方案1】:

在这种特殊情况下,您只传递指针,因此a1 和a2 指向的对象是b1 和b2 指向的对象。另一方面,A 对象知道B 包含什么,但B 的实例不知道包含在A 中。

因此,我认为操作指向对象的函数应该在B 类中声明。那么如果 B 的存在是 A 的公共 API 的成员(例如带有 getter)就足够了:

class B {
    ...
    void do_something(...) {
        // do something with objects pointed by b1 and b2
    }
};
...
A a;
a.getB()->do_something();
...

如果A 的B 成员是实现细节,你应该在A 中声明一个relay 方法:

class A {
    ...
    void do_something(...) {     // delegate to the `B` member
        b1->do_something(...);
    }
};
...
A a;
a.do_something(...);
...

【讨论】:

  • 为什么拒绝编辑? B 不包含 A。它包含在 A。如果你不喜欢我的编辑,你应该自己解决这个问题。
  • @PaulSanders:当我打开你的编辑时,另一个人已经投票不是改进......。英语不是我的第一语言,但我在这里的意思不仅是 B 不知道它是否包含在 A 中,而且它也不知道 A 它包含在什么中。我觉得您的编辑对此并不清楚。我真的很抱歉,因为我通常很乐意接受任何可以提高我(差)英语的编辑。
  • OK Serge,我会再次编辑它。我知道你想说什么(你说的完全正确),我想把它说清楚,仅此而已。
【解决方案2】:

反之亦然,您也可以成为班级的朋友。 look here.

这允许成员和方法的“交叉使用”

如果你只希望一个函数同时访问 A 和 B 的私有成员和方法,你可以加好友这个特定的函数。

【讨论】:

  • 这也将类耦合到了极致。我不建议这样做。
猜你喜欢
  • 1970-01-01
  • 2012-02-23
  • 2017-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-13
  • 2012-04-12
  • 1970-01-01
相关资源
最近更新 更多