我是C ++新手,我需要一个奇怪问题的帮助(或者至少对我来说很奇怪)
我有一个班级:
class Myclass {
private:
int A;
// some other stuff...
public:
// constructor and stuff...
void setA(int a);
int* getA_addr();
};
void Myclass::setA(int a){
A = a;
};
int* Myclass::getA_addr(){
return &A;
};
现在,我想修改main()中的A并且我没有在类中使用任何其他方法(我通过使用额外的方法来实现它,现在我想看看如何在不使用这些额外内容的情况下完成它)。我有这样的功能:
void change(int *ptr, int tmp){
*ptr = tmp;
};
在对这个函数的调用中,我这样做了传递:change(obj.getA_addr(), other arguments...)
其中obj是Myclass的一个实例。
以这种方式完成后,我没有收到任何编译错误,但我似乎也无法修改A(obj)。作为调试工作,我尝试通过直接调用getA_addr()来打印A(of obj)的地址。我看到每次调用时,函数返回一个不同的地址。所以我假设我没有将预期的地址传递给函数。
我不知道为什么会这样,想知道。此外,我尝试这样做的方式很可能根本不准确,所以请,如果您能提供解决方案,我们将不胜感激。感谢。
编辑: Here's the most minimal code I could come up with that reproduces the error
#include <iostream>
#define MAX_SIZE 10
using namespace std;
class Student {
private:
int mt1;
public:
Student();
void setMt1(int in_mt1);
int* getMt1();
};
Student::Student() {};
void Student::setMt1(int in_mt1) { mt1 = in_mt1; };
int* Student::getMt1(){ return &mt1; };
class Course {
private:
Student entries[MAX_SIZE];
int num;
public:
Course();
void addStudent(Student in_student);
Student getStudent(int index);
};
Course::Course(){ num = 0; };
void Course::addStudent(Student in_student){
entries[num] = in_student;
num++;
};
Student Course::getStudent(int index){ return entries[index]; };
int main() {
void updateStudentScore(int *uscore, int newscore);
Course mycourse;
Student tmp_student;
tmp_student.setMt1(60);
mycourse.addStudent(tmp_student);
cout<<mycourse.getStudent(0).getMt1()<<"\t"<<*mycourse.getStudent(0).getMt1()<<endl;
updateStudentScore(mycourse.getStudent(0).getMt1(), 90);
cout<<mycourse.getStudent(0).getMt1()<<"\t"<<*mycourse.getStudent(0).getMt1()<<endl;
return 0;
}
void updateStudentScore(int *uscore, int newscore){
*uscore = newscore;
};
我很确定我对指针和传递方式的理解是缺乏的,我在这里定义函数的方式是创建错误。很抱歉给你们带来不便。如果你能看看,我将不胜感激。
答案 0 :(得分:0)
查看您的学生/课程代码,我注意到Course::getStudent
返回Student
而不是Student &
。基本上,这意味着每次拨打getStudent(x)
时,您都会获得学生x
的临时副本,其getMt1
函数会为您提供指向临时字段的指针,你所做的任何改变都不会超过这个陈述。
如果您getStudent
返回引用或指针,则更改应保留在数组中包含的Student中。 (但它们仍然不会影响tmp_student
,因为addStudent
复制了它以将其添加到数组中。如果你想要那么可靠,那么你需要重做一些东西。)