首页 文章

无法在Visual Studio 2010中的自引用对象中指定指针

提问于
浏览
2

我正在学习C,我目前有一些问题,我不知道答案 . 我创建此头文件Object1.h并可以编译此文件,但是当我运行Test.cpp时,Visual Studio会因为* sibling的访问冲突而抛出错误 . 奇怪的是我可以使用Dev C运行它并且它只返回值2.因此我想问为什么分配* sibling会产生错误以及为什么我不能使用setAddress()更改Person B的地址 . 如果有人能给我一些答案或提示,我将非常感激 . 提前致谢 .

//This is Object1.h
#include <iostream>
using namespace std;

class Person{
public:
    Person(int ID);
    void setAddress(string addr);
    string getAddress();
    void addSibling(Person *p);
    Person getSibling();
    int ID;
private:    
    string address;
    Person *sibling;
};

Person::Person(int ID){
    this->ID = ID;
}

void Person::setAddress(string addr){
    this->address = addr;
}

string Person::getAddress(){
    return address;
}

void Person::addSibling(Person *p){
    *sibling = *p;
}

Person Person::getSibling(){
    return *sibling;
}
//This is Test.cpp
#include <iostream>
#include <string>
#include "Object1.h"
using namespace std;

int main(){
    Person A(1);
    Person B(2);
    A.addSibling(&B);
    // Change the address of person B through person A's getSibling()
    A.getSibling().setAddress("123 Street");

    cout << B.getAddress() <<endl;
    cout << B.ID;

    system("Pause");
    return 0;
}

2 回答

  • 2

    一个值得注意的问题是你在 getSibling() 中按值返回,所以你会得到兄弟的副本而不是真正的兄弟 . 您所做的任何更改都将是临时对象 .

    正如其他人所说,你的addSibling函数应该是 sibling = p . 这是你错误的根源 .

    但请务必更正您的getSibling函数,否则您的setAddress将无法执行您想要的操作 .

  • 0

    使用operator *假设您处理存储在此变量中的地址所驻留的某些数据 . 我们来看看您的代码:

    *sibling = *p;
    

    您试图按值复制 . 这是错误的,因为兄弟姐妹指向无处 . 它甚至不是NULL,它是不可预测的 . 正确的行将是:

    sibling = p;
    

    所以你告诉那将存储指向另一个实例的指针 .

相关问题