在不使用公共方法

时间:2017-10-27 14:02:33

标签: c++

我是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;
};

我很确定我对指针和传递方式的理解是缺乏的,我在这里定义函数的方式是创建错误。很抱歉给你们带来不便。如果你能看看,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

查看您的学生/课程代码,我注意到Course::getStudent返回Student而不是Student &。基本上,这意味着每次拨打getStudent(x)时,您都会获得学生x临时副本,其getMt1函数会为您提供指向临时字段的指针,你所做的任何改变都不会超过这个陈述。

如果您getStudent返回引用或指针,则更改应保留在数组中包含的Student中。 (但它们仍然不会影响tmp_student,因为addStudent复制了它以将其添加到数组中。如果你想要那么可靠,那么你需要重做一些东西。)