【问题标题】:Call a Non Static Member Method from Another Method从另一个方法调用非静态成员方法
【发布时间】:2012-03-31 14:08:21
【问题描述】:

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

问题是,我不能将此特定方法声明为静态,因为它使用同一类中的其他方法,如果我将其设为静态,这些方法将不起作用。

我正在尝试使用:

MyClass::myClassMethod();

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

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

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

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

【问题讨论】:

  • 在阅读了已经发布的答案中的问题和 cmets 之后,了解更多关于您正在尝试做什么的信息仍然很有用。 myClassMethod 本身是静态的吗?它是从哪里调用的?你能改变方法的参数吗?分配给您的问题的目标是什么?
  • 看起来你真的需要考虑一下你可能想要什么行为。静态方法和非静态方法的主要区别在于后者需要访问类数据,或者可能进行内部相同的虚拟调用。如果myClassMethod 调用非静态的anotherClassMethod,是否需要这样做?如果没有,请将它们设为静态。如果是这样,那么当该方法尝试访问数据时,您期望会发生什么?

标签: c++ class methods static-methods


【解决方案1】:

static 成员函数调用非静态成员函数是怎么回事?

除了您传递的参数之外,每个非静态成员函数都会隐式传递一个this 指针,然后将传递的指针取消引用以引用类对象成员但是static 函数不会通过隐式thispointer 传递因此不能在静态成员函数中调用任何非静态成员函数,因为没有this 可以这样做。

如果你还想做的话,有什么解决办法?

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

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


再想一想,也许我之前误读了您的问题,您的问题可能是:

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

你需要一个类的实例来调用非静态成员函数。
很简单,

MyClass obj; 
obj.myClassMethod();   

myClassMethod() 中调用任何其他成员函数将是:

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

【讨论】:

  • 对不起,我是新手。我该怎么做?
  • @aclark:请检查更新的答案,我添加了更多细节。有意义吗?
  • 感谢您的解释。问题是,设计是由导师给出的,所以我必须使用它。对我来说似乎也很复杂:-/
【解决方案2】:

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

如果你的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() 应该做什么。当您没有要使用的实例时调用它是否有意义?如果是这样,为什么它需要调用一个期望与实例一起工作的方法?

【讨论】:

    【解决方案3】:

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

    MyClass myClass;
    myClass.myClassMethod();
    

    【讨论】:

      【解决方案4】:

      我认为也许你可以使用单例模式,在全局中保留一个类的实例。像一个实用程序类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-28
        • 1970-01-01
        • 1970-01-01
        • 2010-12-24
        • 1970-01-01
        • 2013-08-25
        • 1970-01-01
        相关资源
        最近更新 更多