【问题标题】:C++ static object Class functionC++静态对象类函数
【发布时间】:2012-09-29 20:12:39
【问题描述】:

一些代码: 请参阅下面的 myClass 类。它有一个构造函数和一个公共递归函数 find。请看代码:

#include <iostream>
using namespace std;

class myClass{
    public:

    myClass() {
        //do stuff
    }

    int find(int i) {
        static int j = 10;

        if (i > 15)
            return i;

        j = j + 1;
        return i * find(j + 1);
    }
};

int main() 
{

    myClass mC1 ,mC2;

    cout<< " 1.... return value = "<< mC1.find(10);
    cout<< " \n 2... return value = "<< mC2.find(10);

    return 1;
}

输出:

1.... return value = 5241600 
2.... return value = 170

上面的程序有一个类 myclass 有一个函数 find .. “find” 函数有一个 variabe 。这是静态的,因为我想要一个递归函数。问题是静态变量具有程序的生命并绑定到类。

但是我希望静态是 object 特定的而不是 class 范围。我希望这两个函数调用都返回相同的值。

简单地说,如何在类函数中创建一个静态变量,使其成为每个对象而不是整个类......

【问题讨论】:

    标签: c++ class object static


    【解决方案1】:

    你需要一个成员变量吗?

    希望以下代码有所帮助。

    最好的问候 山姆

    class myClass{
      public 
      myClass() {
       m_j = 10;
      }
    
      private:
       int m_j; // private member variable for find algorithm; 
    
    
      int find(int i) {
        if(i>15)
          return i;
        m_j= m_j+1;
        return i * find(m_j+1);
    
       }
    

    };

    【讨论】:

      【解决方案2】:

      如果你想要一个每个对象的变量,你需要让它成为相应对象的成员。无法在函数内声明特定于对象的变量。您使用 use static 成员的方式无论如何都可以更改为非静态,即,您将获得必要的上下文:使函数非静态并根据需要将数据存储在对象中。

      也就是说,仅仅因为函数是递归的并不意味着它需要任何类型的static 上下文。通常,所有必要的上下文都作为参数传递给递归函数,在这种情况下,系统会将必要的状态保留在堆栈上。由于堆栈的大小相对有限,您需要确保在具有深度调用堆栈的递归函数中不需要太多上下文。

      由于您可能不希望用户传递某些内部上下文,因此接口中的find() 函数可能只是委托给提供必要上下文的递归函数。例如:

      int find(int j, int i) {
          if (15 < i) {
              return i;
          }
          ++j;
          return i * find(j, j + 1);
      }
      int find(int value) {
          return find(10, value);
      }
      

      (我不确定我是否得到了所需的逻辑,因为我没有完全理解该函数的用途......)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-12
        • 1970-01-01
        • 1970-01-01
        • 2018-04-05
        • 2020-08-29
        • 2011-05-20
        • 1970-01-01
        • 2011-12-08
        相关资源
        最近更新 更多