0

关于声明函数的快速问题。可以说我有以下代码:

class a{
    int var;
    /* stuff*/
}

class b : a{
    /* other stuff*/
}

class c : a{
    /* more other stuff*/
}

class d{
    myFunctionThatWantsTheIntNamedVar(SubClassOfClassA SomeClassUnknownAtCompileTime);
}

而 myFunctionThatWantsTheIntNamedVar() 就是想要在 a 的基类中声明的整数(称为 var)。类 d 中的函数可以传递类 b 或类 c 的实例,这在编译时是未知的(仅在运行时)。

有没有一种方法可以简洁地声明一个可以采用 b 类或 c 类并获得相同基变量的函数?

同时我所做的是在 d 类中声明两个方法,如下所示:

class d{
    myFunctionThatWantsTheIntNamedVar(c aClassCInstance);
    myFunctionThatWantsTheIntNamedVar(b aClassBInstance);
}

这很好,但是这两种方法中的代码是相同的......而且根据我对面向对象编程的理解,如果代码相同,你应该能够将它组合成一个更好的功能。

对此有什么想法吗?只是在这里寻找最佳实践或其他建议,因为我在一家小公司工作并且有时很难获得反馈。

编辑:对不起,我的代码有错误,将其更改为:

myfunctionThatWantsTheInNamedVar(a aClassAInstance);

至:

myfunctionThatWantsTheInNamedVar(c aClassCInstance);

我的错。

4

3 回答 3

6

提供一个可以访问变量的公共访问器方法,并确保不要在 b 类和 c 类中隐藏它的名称。

class a{
    int var;
    /* stuff*/
 public:
  const int& getVar() const { return var; }
  int& getVar() { return var; }
};

然后引用一个ain oyur 函数:

class d{
 public:  // you probably want a public member function
    myFunctionThatWantsTheIntNamedVar(const a& theA) {
      int n = theA.getVar();
}

然后你可以用borc实例调用它:

b b0;
c c0;
d d0;
d0.myFunctionThatWantsTheIntNamedVar(b0);
d0.myFunctionThatWantsTheIntNamedVar(c0);

请记住,在您的代码中,变量var是私有的,以及类bc. 为此,您需要公开继承:

class b : public a { .... };
class c : public a { .... };
于 2012-09-14T21:25:47.343 回答
3
class d{
    myFunctionThatWantsTheIntNamedVar(const a& anA);
}

如果您确实要禁止 a 的实际实例,但允许任何派生类,则可以使用运行时类型标识来引发异常(如果它实际上是 a,而不是派生类)。

如果你在 a 中有一个纯虚函数没有实现(但需要 b 和 c 提供实现),那么你甚至不能实例化 a,所以不需要检查。但是,只有当你有理由这样做时——我不会为此建议一个这样的人工构造。

于 2012-09-14T21:22:56.687 回答
1

为什么不这样:

class d{
   void myFunction(A a) {;}
};

如果你说你的两个函数的代码是相同的,这意味着它们没有使用 C 类和 B 类之间不同的任何东西。换句话说,你只使用 B 和 C 的共同点,这实际上是A类。

当然(A a)只是一个例子。您应该根据需要将参数声明为 (const A& a) 或 (A* pA)。另外,我假设它var在其层次结构之外以某种方式可见,或者通过将其公开或更好地,通过将​​其封装在公共访问器中。

于 2012-09-14T21:25:37.263 回答