我已将我的问题分解为一个简单的小程序。
我有一个类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)
答案 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);
}