从另一个方法调用非静态成员方法

时间:2012-03-15 03:03:52

标签: c++ class methods static-methods

有没有办法从c ++中主类中包含的另一个方法调用非静态类成员方法?如果是这样,代码会是什么样的?

问题是,我不能将这个specfic方法声明为static,因为它使用同一个类中的其他方法,如果我将其静态化,则不起作用。

我正在尝试使用:

MyClass::myClassMethod();

来自主类中的方法,但它给出了错误:非静态成员引用必须相对于特定对象。

为了澄清,myClassMethod()使用MyClass中的其他方法,如:

void myClassMethod() {
    ...
    anotherClassMethod();
}

所以,如果我要将myClassMethod设为静态,则会干扰调用anotherClassMethod()。

4 个答案:

答案 0 :(得分:4)

static成员函数调用非静态成员函数有什么处理?

除了传递的参数之外,每个非静态成员函数都隐式传递一个this指针,然后传递的指针被解引用以引用类对象成员但是static函数不会与隐式传递this指针,因此无法在静态成员函数中调用任何非静态成员函数,因为没有this这样做。

解决方案是什么,如果你想这样做呢?

您需要一些机制来获取静态方法内对象的指针,然后您可以使用该指针调用成员函数。
怎么做?
您必须全局存储指向类对象的指针,或者将其作为静态方法的一个函数参数中的实例传递。

但是,以上两者都是变通方法,这里需要注意的重要事项是如果您觉得需要通过静态成员函数调用非静态成员函数,那么您的设计就会出现问题。


关于第二个想法,也许我之前错误地读了你的问题,可能,你的问题是:

如何从main调用类的非静态成员函数?

您需要该类的实例来调用非静态成员函数 简单地说,

MyClass obj; 
obj.myClassMethod();   

myClassMethod()内调用任何其他成员函数只会是:

void myClassMethod()
{
   //...
   anyOtherMyClassNonStaticMemberFunction(); 
   //...
}

答案 1 :(得分:4)

静态方法是不在任何特定对象上运行的方法。它很像一个类外的独立函数,除了它允许访问其类中的私有成员。

如果anotherClassMethod()是非静态的,则意味着必须在特定对象(类的实例)上调用它。因为它是在一个对象上调用的,所以它可以访问存储在该对象中的数据(非静态成员变量)。如果myClassMethod()是静态的,则将其实现为

void MyClass::myClassMethod() {
  anotherClassMethod();
}

这不起作用,因为anotherClassMethod()期望在特定对象上调用,但myClassMethod()没有。但是,如果您知道要调用它的对象,可以将其作为对象的普通方法调用:

void MyClass::myClassMethod(MyClass &object) {
  object.anotherClassMethod();
}

object不必作为参数传递;它可以是类中的静态成员变量,例如:

class MyClass {
private:
  static MyClass theInstance;

  // ...
};

void MyClass::myClassMethod() {
  theInstance.anotherClassMethod();
}

最终,您需要问自己的问题是:为什么myClassMethod()是静态的,为什么anotherClassMethod()是非静态的?退后一步,想想myClassMethod()应该做什么。当你没有可以使用的实例时调用它是否有意义?如果是这样,为什么需要调用一个期望与实例一起使用的方法?

答案 2 :(得分:3)

调用类的非静态方法的唯一方法是通过该类的实例。所以你需要这样的东西......

MyClass myClass;
myClass.myClassMethod();

答案 3 :(得分:0)

我认为也许你可以使用单例模式,将类的实例保存在全局中。就像一个实用工具类。