我正在学习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 回答
一个值得注意的问题是你在
getSibling()
中按值返回,所以你会得到兄弟的副本而不是真正的兄弟 . 您所做的任何更改都将是临时对象 .正如其他人所说,你的addSibling函数应该是
sibling = p
. 这是你错误的根源 .但请务必更正您的getSibling函数,否则您的setAddress将无法执行您想要的操作 .
使用operator *假设您处理存储在此变量中的地址所驻留的某些数据 . 我们来看看您的代码:
您试图按值复制 . 这是错误的,因为兄弟姐妹指向无处 . 它甚至不是NULL,它是不可预测的 . 正确的行将是:
所以你告诉那将存储指向另一个实例的指针 .