2010-10-03 60 views
1

我正在學習C++,而我目前有一些問題,我不知道答案。我創建了這個頭文件Object1.h並且可以編譯這個文件,但是當我運行Test.cpp時,由於* sibling訪問衝突,Visual Studio會拋出一個錯誤。奇怪的是,我可以使用Dev C +運行它,它只返回值2.因此,我想問爲什麼分配*兄弟會創建一個錯誤,爲什麼我不能使用setAddress()更改Person B的地址。如果有人能給我一些答案或提示,我會很感激。提前致謝。無法在Visual Studio 2010中的自引用對象中分配指針


//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; 
} 
+0

你能提供你得到的確切的錯誤嗎?你知道哪一行會拋出錯誤嗎? – JoshD 2010-10-03 18:49:59

+1

嗨喬希,我在Object1.h函數addSibling()第32行得到一個錯誤。 「兄弟」變量錯誤。錯誤:無法評估表達式。但是,如果我編譯並使用Dev-C運行,則不會通知錯誤。 – Steven 2010-10-03 19:01:36

回答

1

使用運算符*假定您處理存儲在此變量中的地址所駐留的某些數據。讓我們來看看您的代碼:

*sibling = *p; 

您試圖按值複製。這是錯誤的,因爲兄弟姐妹指向無處。它甚至不是NULL,它是不可預測的。正確的行將是:

sibling = p; 

所以你告訴那將存儲指針到另一個實例。

0

一個值得注意的問題是,你的價值由getSibling()回來,所以你會得到的兄弟,而不是實際的兄弟的副本。您所做的任何更改都是臨時對象。

正如其他人所指出的,你的addSibling函數應該是sibling = p。這是你錯誤的根源。

但一定要糾正你的getSibling函數,否則你的setAddress將不會做你想要的。