Я разбил свой вопрос на небольшую простую программу.Статические функции и переменные класса?
У меня есть класс myclass
Я создал в отдельном файле .cpp «classes.cpp» и объявлен в файле заголовка «classes.h». myclass
содержит переменную a
, из которой инициализируется при создании экземпляра. Это делает переменную a = 5
.
Моя общая цель - создать класс в отдельном файле .cpp, объявленном в файле .h, который я могу создать несколько экземпляров в моей программе main()
. Проблема, с которой я столкнулась, заключается в следующем.
В моей функции main()
я создаю экземпляр myclass
под названием first
. Моя основная программа показывает, что переменная a
установлена на номер 5. Если я хочу изменить это число, используя статическую функцию (и она должна быть статической функцией, поскольку это относится к чему-то значительно большему в другой программе, которую я пишу) , Я вызываю статическую функцию напрямую и в этой static_function создаю экземпляр myclass
и вызываю функцию non_static_function, потому что статические функции не подразумевают «это», соединяющие их с объектом.
В моей функции non_static_function я изменяю значение на число 8. Проблема в том, что значение переменной 'a' в 'first' остается в 5, когда я хочу, чтобы оно было 8. Мне нужно изменить значение, используя first->static_function(8)
, а не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'), который вы хотите изменить. – Carcigenicate
Вот почему вы создаете экземпляр этого объекта в своей статической функции и вызываете функцию non_static. Насколько я знаю, функция non_static_function должна иметь возможность изменить значение класса (и я не уверен, почему он не будет отражать в первом экземпляре. – Svetsi
'p' в' static_function' сразу же выходит из области видимости в конце функции, поэтому ничего не повлияет. Имейте в виду, что 'p', созданный в' static_function', полностью отделен от любого другого созданного вами экземпляра, например 'first'. Изменение «p» на 0 будет иметь значение «first». Будьте осторожны, используя 'new', вы не должны использовать его, как и вы. Вы никогда не вызываете delete на нем, поэтому он никогда не освободит запрашиваемое пространство (что не происходит автоматически, как в java). Как правило, вы никогда не должны использовать 'new' вне конструктора. – Carcigenicate