2017-08-29 146 views
1

我有一個場景,我經常使用非指針變量,包括對象。將非指針變量作爲指針的參考傳遞給函數

我想將這些變量設置爲數組中的一組現有數據,但我不想要軟拷貝,而是希望非指針變量直接指向另一個變量的內存地址。

這是一個簡單的示例代碼片段,爲我的困境。

struct User 
{ 
    unsigned int ID; 
    std::string Name; 

    User(int id, std::string name) 
    { 
     ID = id; 
     Name = name; 
    } 
}; 

User data[] = 
{ 
    User(2, "Jane Smith"), 
}; 

void ChangeUser(User& user) 
{ 
    user = data[0]; 
} 

int main() 
{ 
    User first; 
    ChangeUser(first); 

    return 0; 
} 

如果我想要,可以將其更改爲新地址的功能,我可以通過非指針對象的指針的對象。

void ChangeUser(User* user) 
{ 
    user = &data[0]; 
} 

int main() 
{ 
    User first; 
    ChangeUser(&first); 

    return 0; 
} 

但是,這不會改變函數外部的變量,因爲它通過值傳遞指針。我能做的就是通過引用傳入一個指針,這意味着如果我傳入一個指針,即使在函數之後數據也會被更改。但是,如果我嘗試使用非指針變量,則在調用函數時出現此編譯錯誤。

error C2664: 'void ChangeUser(User *&)' : cannot convert argument 1 from 'User *' to 'User *&' 

如果我如下創建一個指針變量,編譯器將接受它,並且將指針的數據設置爲所述陣列中的成員的指針。

但是,如果我必須使用非指針變量,是否有一種方法可以實現相同的任務?理想情況下,我希望能夠將User變量保存爲類的成員,因此不能使用本地引用變量。

+0

「但是,如果我嘗試使用非指針變量,則在調用函數時出現此編譯錯誤。」請發佈導致此錯誤的代碼... – jpo38

+0

@ jpo38他們做到了。 – user0042

+0

「*我想讓非指針變量直接指向另一個變量的內存地址。」這聽起來有點不可能。 – juanchopanza

回答

0

代碼

User first; 
ChangeUser(&first); 

有效傳遞一個const User*&指針引用(右值)的函數(其中希望是一個非const左值),因此該錯誤。

您無法更改已分配對象的地址。

+0

啊我看到了,所以這隻能用指針工作? –

+1

它傳遞'User *'。而且你不能改變任何對象的地址,也不能分配堆棧。 – juanchopanza

+0

@juanchopanza我知道,這就是爲什麼我寫了「有效」_。你能提出一個更好的措辭嗎? – user0042