静态函数在C ++中调用非静态函数

时间:2012-11-11 13:17:17

标签: c++ static

我有一个像::

这样的课程
Class Test
{
  public:
  void Check(){//dosomething};
  static void call(){//I want to call check()};
};

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

4 个答案:

答案 0 :(得分:10)

由于您需要一个实例,您必须创建一个实例,使用静态实例或将其传递给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(); };
};

答案 1 :(得分:3)

这听起来有些糟糕的设计正在进行中。

无论如何,你可以做的是在调用中创建一个Test实例,并在该实例上调用Check。调用的实现将是这样的:

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

但是,请注意,如果Check对Test成员执行某些操作,则它仅适用于创建的Test对象。我会重新考虑你是否真的希望呼叫是静态的,或者检查不是。

答案 2 :(得分:0)

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

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

如果你能解释一下,那么提供更具体的建议会更容易。

答案 3 :(得分:0)

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

如果要从静态成员调用非静态成员函数,则仍需要提供一个对象。通常,静态成员函数将在某些上下文中传递以获取对象。从您的问题的声音看来,静态和非静态函数似乎是为了做类似的事情,不需要和对象。在这种情况下,最好将公共部分(不依赖于任何对象)分解为另一个函数,然后从call()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"
}

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