2013-08-26 102 views
1

首先,我想說的是,在編程方面,我仍然是一個完全新手,而且我已經在尋找這個問題的答案,事情是,我不知道什麼是錯的。函數不能按預期工作?

我寫了一個函數來設置參數爲SF ::文本對象:

void FontParam(sf::Text obj, sf::Font font, std::string text, sf::Color color, int size, int positionX, int positionY) 
{ 
    obj.setCharacterSize(size); 
    obj.setFont(font); 
    obj.setColor(color); 
    obj.setString(text); 
    obj.setPosition(positionX,positionY); 
} 

使用:

FontParam(t[0],font_Clubland,"R",sf::Color::White,100,100,100); 

和繪圖它不會工作。寫作:

t[0].setFont(font_Clubland); 
t[0].setColor(sf::Color::White); 
t[0].setPosition(100,100); 
t[0].setString("R");  
t[0].setCharacterSize(100); 

並繪製它會。

任何幫助或提示,非常感謝,提前致謝!

編輯:---------------------------

櫃面任何人想知道,訪問衝突發生的事情,因爲我沒引用sf :: Font。正確的功能是:

void FontParam(sf::Text &obj, sf::Font &font, std::string text, sf::Color color, int size, int positionX, int positionY) 
{ 
    obj.setCharacterSize(size); 
    obj.setFont(font); 
    obj.setColor(color); 
    obj.setString(text); 
    obj.setPosition(positionX,positionY); 
} 

感謝您的幫助!

+10

您正在修改obj的本地副本而不是原始副本。通過參考。 – Borgleader

+1

更改它'&obj' –

+0

獲取訪問衝突,請參見[這裏](http://puu.sh/4brsg/9cd0e4d771.png) – user2558804

回答

2

您正在向您的函數傳遞副本t[0],更改副本,然後放棄更改。相反,您可能希望通過引用來傳遞t[0],以便將更改更新爲原始對象。這很容易通過將參數sf::Text obj更改爲sf::Text& obj(請注意添加了&)。

+0

剛剛在一個單獨的項目中測試過它,不知道現在發生了什麼:[link ](http://puu.sh/4brsg/9cd0e4d771.png) – user2558804

0

語法

void FontParam(sf::Text obj 

被稱爲「按值傳遞」 - 你是原來的SF文本::值傳遞給這個函數,和一個新的本地副本與生命時創建的功能。

這是一個默認行爲,因爲大部分時間,您將值傳遞給一個函數,並且不希望該函數修改您的本地工作。

for (int i = 0; i < 10; ++i) { 
    function(i); 
} 

如果「函數(i)」將「i」更改爲11,則會產生錯誤的行爲。

要更直接地傳遞一個變量,以便調用者和函數共享相同的實例,您必須使用傳遞引用或傳遞指針。

傳遞引用在接收者的變量名稱上使用「&」裝飾器。傳遞指針使用「&」引用來獲取發送變量的地址和「*」作爲接收器上的裝飾器,但是您還必須檢查空指針並使用derefences,所以我只是去描述通過引用。

#include <iostream> 
#include <string> 

void foo1(std::string str) { 
    str += "Hello"; 
} 

void foo2(std::string str) { 
    str += "World"; 
} 

int main() { 
    std::string str = ""; 
    foo1(str); 
    foo2(str); 
    std::cout << str << std::endl; 
} 

將輸出「世界」。

您可能需要在許多地方對此類更改進行翻新。

一個很好的方法可以幫助你避免這樣的錯誤,當你特意打算使它們成爲不可變的時候,將參數修飾爲「const」,有可能迫使你使用局部變量來捕獲修改。

void print(const std::string& str, const int x, const int y) 
{ 
    const int endX = x + widthPx(str) + 4; 
    const int endY = y + heightPx(str) + 4; 
    drawBow(x, y, endX, endY); 
    const int cursX = x + 1; 
    const int cursY = y + 1; 
    cursor(cursX, cursY); 
    drawText(str); 
} 

注意,如果可能,你應該採取的std ::由常量字符串&避免複製的開銷(複製字符串可以得到昂貴的快)。

相關問題