静态函数和类变量?

时间:2015-05-20 10:45:25

标签: c++ function static

我已将我的问题分解为一个简单的小程序。

我有一个类myclass我在一个单独的.cpp文件“classes.cpp”中创建并在头文件“classes.h”中声明。 myclass包含一个变量a,在实例化时会初始化。这使得变量a = 5

我的总体目标是在.h文件中声明的单独.cpp文件中创建一个类,我可以在main()程序中创建多个实例。我遇到的问题是这个。

在我的main()函数中,我创建了一个名为myclass的{​​{1}}实例。 我的主程序显示变量first设置为数字5。 如果我想使用静态函数更改该数字(并且它必须是静态函数,因为这与我正在编写的另一个程序中的更大的东西有关)。我直接调用静态函数,在static_function中我创建了一个a的实例并调用了non_static_function,因为静态函数没有隐式'this'将它们连接到一个对象。

在我的non_static_function中,我将值更改为数字8.问题是当我希望它为8时,'first'中变量'a'的值保持为5.我需要使用{{更改值} 1}} 而不是 myclass。 。我怎么能这样做?

以下代码:

first->static_function(8)

2 个答案:

答案 0 :(得分:2)

如果您希望myclass的每个实例都有自己的a并且您想要调用静态函数来更改它,那么您需要将要更改的实例传递给静态函数。静态函数只能修改类的静态成员或其范围内的实例的成员。非静态成员函数可以更改属于该类成员的任何变量。

class Foo
{
private:
    int bar;
public:
    static void static_function(int value, Foo & foo) { foo.bar = value; }
    void non_static_function(int value) { bar = value; }
};

int main()
{
    Foo foo;
    Foo::static_function(8, foo);
    // now bar will have the value of 8
    foo.non_static_function(20);
    // now bar will have the value of 20
}

答案 1 :(得分:0)

我终于找到了解决这个小问题的方法。在myclass'之上classes.cpp中的定义我声明了一个' myclass'变量 myclass * tgt; 。然后在我的myclass'的构造函数中我只是将实例化对象分配给我的全局myclass变量,我可以从myclass定义中访问该变量 tgt = this; 现在我可以在我的静态函数中使用tgt来调用我的&#39中的non_static_function ; MyClass的'定义,它都完美无缺。

NathanOliver ,你说我需要一个类实例是正确的,但我在这里做的方式适合我的需要。传递myclass的实例当然是另一种方法,但它需要一个全局函数,高于我的myclass'定义。

感谢您的帮助。

    **main.cpp**
    #include <iostream>
    #include "classes.h"

    using namespace std;

    int main()
    {

         myclass *first = new myclass();
 cout << "Myclass variable a is = " << first->a << endl;

 first->non_static_function(8); // trying to change myclass variable 'a' to 8.

cout << "But" << endl;
cout << "The actual value of a is still: " << first->a << endl;

myclass *second = new myclass();
cout << "For the 'second' class the variable a is: " << second->a << endl;
second->non_static_function(23);
cout << "After calling the static function from 'second' the value of a is: " << second->a << endl;
cout << "And first->a is still: " << first->a << endl;
    }



    **classes.h**
    #ifndef CLASSES_H_INCLUDED
    #define CLASSES_H_INCLUDED
    class myclass
    {
    public:
        int a;
        myclass();

        void non_static_function(int x);
        static void static_function(int x);

    };
    #endif // CLASSES_H_INCLUDED





    **classes.cpp**
    #include <iostream>
    #include <cstdlib>
    #include "classes.h"

    using namespace std;

    myclass *tgt;  // *Add a global myclass variable above the myclass 
      definition*

    myclass::myclass()
    {
       tgt = this;  // *In the constructor allocate the instantiated class
   //from main() to "tgt" .*
        a = 5;
    }

    void myclass::non_static_function(int x)
    {
        a = x;
    // Now see that the value of a is changed.
   cout << "The value for variable 'a' was 5 but is now: "<< this->a << endl;
    }

    void myclass::static_function(int x)
    {
        tgt->non_static_function(x);
    }