Невозможно назначить указатель в объекте со ссылками в Visual Studio 2010 - PullRequest
2 голосов
/ 03 октября 2010

Я изучаю C ++, и в настоящее время у меня есть несколько вопросов, ответы на которые я не знаю.Я создаю этот заголовочный файл Object1.h и могу скомпилировать этот файл, но когда я запускаю Test.cpp, Visual Studio выдает ошибку из-за нарушения прав доступа * sibling.Странно то, что я могу запустить его, используя Dev C +, и он возвращает только значение 2. Поэтому я хочу спросить, почему назначение * sibling приведет к ошибке и почему я не могу изменить адрес Person B с помощью setAddress ().Я буду очень признателен, если кто-нибудь даст мне ответ или намеки.Заранее спасибо.


//This is Object1.h
#include <code>&lt</code>iostream<code>&gt</code>
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 <code>&lt</code>iostream<code>&gt</code>
#include <code>&lt</code>string<code>&gt</code>
#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 <code>&lt&lt</code> B.getAddress() <code>&lt&lt</code>endl;
    cout <code>&lt&lt</code> B.ID;

    system("Pause");
    return 0;
}

Ответы [ 2 ]

2 голосов
/ 03 октября 2010

Использование оператора * предполагает, что вы имеете дело с некоторыми данными, расположенными по адресу, сохраненному в этой переменной. Давайте рассмотрим ваш код:

*sibling = *p;

Вы пытаетесь скопировать по значению. Это неправильно, потому что брат указывает на никуда. Это даже не NULL, это непредсказуемо. Правильная строка будет:

sibling = p;

Итак, вы говорите, что будете хранить указатель на другой экземпляр.

0 голосов
/ 03 октября 2010

Одна заметная проблема заключается в том, что вы возвращаете по значению в getSibling(), поэтому вы получите копию родного брата, а не фактического родного брата. Любые изменения будут сделаны для временного объекта.

Как уже отмечали другие, функция addSibling должна быть sibling = p. Это источник вашей ошибки.

Но обязательно исправьте свою функцию getSibling, иначе ваш setAddress не будет делать то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...