11

我有一个像::

Class Test
{
  public:
  void Check(){//dosomething};
  static void call(){//I want to call check()};
};

因为call()是静态成员,所以不能调用非静态函数,所以我觉得call()中使用Check()就是创建Test指针,然后指向Check(),但我认为是不好,有没有更好的方法来做到这一点?我可以重写静态函数中的所有东西,所以我不需要再次调用 Check(),但我想要的是重用 Check() 中的代码并避免重复代码。

4

4 回答 4

13

由于您需要一个实例,您要么必须创建一个实例,使用静态实例,要么将其传递给call()

Class Test
{
  private:
  static Test instance;

  public:
  void Check(){//dosomething};
  // use one of the following:
  static void call(Test& t){ t.check(); };
  static void call(){ Test t; t.check(); };
  static void call(){ instance.check(); };
};
于 2012-11-11T13:23:03.140 回答
3

这听起来像是在进行一些糟糕的设计。

无论如何,您可以做的是在调用中创建一个 Test 实例,然后在该实例上调用 Check。那么 call 的实现将是这样的:

void call(){
  Test test;
  test.Check();
}

但是,请注意,如果 Check 对 Test 的成员做某事,它当然只会应用于创建的 Test 对象。我会重新考虑您是否真的希望 call 是静态的,或者 Check 不是。

于 2012-11-11T13:22:15.203 回答
0

对此没有简单的答案。您可以做很多事情,但正确的事情取决于您的代码的含义。这是一个设计问题,而不是编程问题。

您已经提出了可以做的各种编程技巧,例如创建Test指针(实际上您不需要Test指针,只需要一个Test对象)。我可以建议更多技巧,例如您可以重写call()以使其不是静态的,或者(几乎相同的东西)您可以将Test指针作为参数传递call()并使用它,或者您可以创建一个全局Test对象并使用它。这些都没有触及问题的核心。要回答您的问题,您必须问自己一些问题,例如,我为什么call()首先制作静态函数,为什么静态函数需要调用非静态函数。

如果您可以解释这一点,那么提供更具体的建议会更容易。

于 2012-11-11T13:24:44.857 回答
0

非静态成员函数和静态成员函数之间的关键区别在于后者没有任何对象。但是,它仍然具有与所有其他成员相同的访问权限。

但是,当您想从静态成员调用非静态成员函数时,您仍然需要提出一个对象。通常,静态成员函数会在某些上下文中传递以获取对象。从您的问题的声音来看,静态和非静态函数似乎是为了做不需要和反对的类似事情。在这种情况下,最好将不依赖于任何对象的公共部分分解到另一个函数中,然后从call()and调用该函数Check()

void Test::call() {
    common();
    // ... other code
}
void Test::Check() {
    common();
    // ... other code, possibly depending on "this"
}
void Test::common() {
    // logic shared by both call() and Check() but not depending on "this"
}

如果公共代码需要一个对象,除了在静态成员函数中提供一个对象之外别无他法。

于 2012-11-11T13:27:19.807 回答