1

假设我们有以下给定代码:

class T; // with T::~T is virtual
class S;
class E {
  void foo() {
    /* ... */
    S s;
    T* t = new T(s);
    /* ... */
    delete t;
    /* ... */
  }
};

我们无法改变E

现在假设我们有:

class S;
class A {
  class T : public ::T {
    T(S);
  }
};

什么方法(在 C++03 中!)我们可以强制E实例化A::T而不是::Tin E::foo,而不改变E::fooor的实现E

注意:如果真的有必要,可以E从我们指定的东西(例如A)中继承,但我不希望这样做。


一般说明:是的,这闻起来像一个设计缺陷,但我有意识地决定将一小部分集成代码稍微修改一下,以便所有其他(更大!)部分可以漂亮地独立且良好 -设计的。

4

1 回答 1

1

有两个答案适用 - 诚然,两者都涉及您问题的边界:

1. 模板化

template <typename T>
class E {
  void foo() {
    /* ... */
    S s;
    T* t = new T(s);
    /* ... */
    delete t;
    /* ... */
  }
};

现在,从技术上讲,这并没有改变 E::foo... 的实现(如果你愿意,它只是定义了一个更通用的)。

2.邪恶

即使在一些最不利的情况下,真正的 -dumb- 方法也能奏效:

#define T A::T   // I didn't **recommend** this; it is just _a way_
于 2011-11-27T19:07:52.843 回答