【发布时间】:2015-05-20 10:45:25
【问题描述】:
我已将我的问题分解为一个简单的小程序。
我有一个类myclass 我在一个单独的.cpp 文件“classes.cpp”中创建并在头文件“classes.h”中声明。 myclass 包含一个变量a,它在实例化时被初始化。这使得变量a = 5。
我的总体目标是在 .h 文件中声明的单独 .cpp 文件中创建一个类,我可以在我的 main() 程序中创建多个实例。我遇到的问题是这样的。
在我的main() 函数中,我创建了一个名为first 的myclass 实例。
我的主程序显示变量 a 设置为数字 5。
如果我想使用静态函数更改该数字(并且它必须是静态函数,因为这与我正在编写的另一个程序中更大的东西有关)。我直接调用静态函数并在该静态函数中创建myclass 的实例并调用非静态函数,因为静态函数没有将它们连接到对象的隐式“this”。
在我的 non_static_function 中,我将值更改为数字 8。问题是当我希望它为 8 时,“first”中的变量“a”的值保持为 5。我需要使用 @987654331 更改值@ 而不是 first->a = 8。 .我该怎么做?
代码如下:
**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->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;
}
**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::myclass()
{
a = 5;
}
void myclass::non_static_function(int x)
{
a = x;
cout << "The value for variable 'a' was 5 but is now: " << a << endl;
}
void myclass::static_function(int x)
{
myclass *p = new myclass();
p->non_static_function(x);
}
【问题讨论】:
-
不能用静态方法改变非静态字段,除非传入要改变的实例(
first)。 -
这就是为什么您在静态函数中创建该对象的实例并调用非静态函数的原因。据我所知,non_static_function 应该能够更改类值(而且我不确定为什么它不会反映在“first”实例中。
-
pinstatic_function在函数结束时立即超出范围,因此不会影响任何内容。请记住,在static_function中创建的p与您创建的任何其他实例完全分开,例如first。更改有关p的任何内容将对first产生 0 影响。小心使用new,你不应该像现在这样使用它。你永远不会在它上面调用 delete,所以它永远不会释放你请求的空间(这不会像在 java 中那样自动发生)。作为一般规则,你真的不应该在构造函数之外使用new。 -
如果您希望
a可以从任何地方修改,您应该将其设为静态字段,而不是实例字段。 -
“改变任何关于 p 的东西都会对第一个产生 0 影响。”。我认为这是关键点。但是 p 只是在那里调用一个非静态函数(我不在乎它是如何实例化的)。我只需要定义 non_static_function 来更改类值。从输出中可以看出,肯定会调用 non_static_function。但是,我认为您已经提出了如上所述的关键点。那么...有没有办法为“myclass”的所有实例更改变量“a”?