如何从C ++中自己的定义递归调用类成员函数?

时间:2015-06-15 17:08:38

标签: c++ function class c++11

我是C ++的新手,我需要一个类成员函数来调用自己的定义,就像这样 -

class MyClass {
public:  // or private: ?
    // Some code here
    // ...

    void myfunction();

    // ...
};

void MyClass::myfunction()
{
    // Some code here
    // ...

    // Call MyClass::myfunction() here, but how?    

    // ...
}

但是我不知道它的正确语法,如果可能的话,如果不创建通常这样做的对象 - object_name.member_function(),它怎么能自己调用​​呢?

而且,如果myfunction()属于public:private:,会有什么不同吗?

4 个答案:

答案 0 :(得分:10)

由于该功能不是静态的,您已经有一个实例来操作

this->

你可以关闭{{1}},我只是更清楚如何调用这个函数。

答案 1 :(得分:4)

myfunction()属于班级范围,因此您可以“简单地”调用它:

class MyClass {
public:
    // Some code here
    // ...

    void myfunction();

    // ...
};

void MyClass::myfunction()
{
    myfunction();
}

但请注意,这会导致堆栈溢出。你需要一种方法来阻止递归。

答案 2 :(得分:1)

  

但是我不知道它的正确语法,如果可能的话,如果不创建通常这样做的对象 - object_name.member_function(),它怎么能自己调用​​呢?

使用:

void MyClass::myfunction()
{
    // Some code here
    // ...

    // Call MyClass::myfunction() here, but how?
    // One way to call the function again.
    this->myfunction();

    // ...
}

this->mufunction()可以由myfunction()替换。使用this是一种风格选项,可以让代码更容易阅读,就像我一样。

  

而且,如果myfunction()属于public:private:,会有什么不同吗?

不,不会有。您可以从另一个成员函数调用该类的任何成员函数。

答案 3 :(得分:1)

成员函数实际上是一种语法糖。它们描述了一个函数,它以某种方式秘密地获取一个指向对象实例的指针,该对象实例在函数内部可以作为function initialize() { var input = document.getElementById('autocomplete'); var options = {componentRestrictions: {country: 'nl'}}; new google.maps.places.Autocomplete(input, options); } google.maps.event.addDomListener(window, 'load', initialize); 访问。

this

你在电话会议中真正做的是调用struct Foo { vod bar(); }; Foo foo; foo.bar(); Foo::bar(&foo);正在使用指针bar。如何完成从实现到实现,一些编译器/架构将使用特殊寄存器来跟踪当前对象。

另一段语法糖使得所有成员变量和函数在成员函数中可见,就像它们是本地作用域一样

Foo* this

这里实际发生的是:

struct Foo {
    int i;
    int add(int n) {
        return i + n;
    }
    int addx2(int n) {
        return add(n) * 2;
    }
};

return this->i + n;

这意味着很容易遇到本地名称和成员名称之间存在冲突的情况。

return this->add(n) * 2;

出于这个原因,许多工程师小心使用案例或前缀或后缀来帮助他们区分成员,参数和变量。

struct Foo {
    int i;
    Foo(int i) {
        i = i; // not what you expected
    }
};

人们使用各种不同的模式 - 有些人使用struct Foo { // Uppercase for types and functions int m_i; // m_ for member Foo(int i_, int j_) { int i = sqrt(i)); m_i = i + j_; } int Add(int i) { return i_ + i; } }; 来表示成员,有些人使用_namename_来表示成员。

fn_

最重要的是要保持一致。