2015-02-09 58 views
-3

我有隻讀變量類(原則從here截取)更改只讀變量如C++中的目標

#include <iostream> 
#include "test.h" 

using namespace std; 

int main(int argc, const char * argv[]) { 

    Test test; 

    cout << test.x << endl; // Should be 0. 
    test.f(test.x); 
    cout << test.x << endl; // Should be 10. 

return 0; 
} 

的與類測試

#ifndef __CPP_Playground__test__ 
#define __CPP_Playground__test__ 

#include <iostream> 

class Test { 
private: 
    int x_; 

public: 
    const int &x; 
    void f(int target); 
    Test() : x(x_) {} 
}; 

#endif /* defined(__CPP_Playground__test__) */ 

以下結構和適當的CPP文件

#include "test.h" 

void Test::f(int target){ 
    target = 10; 
}; 

但它不起作用。我怎樣才能解決這個問題?

+1

需要初始化'在構造函數中x_'。在'Test :: f()'中做一些實際上有效的事情。 – juanchopanza 2015-02-09 12:10:33

+0

但是這是我的問題:我如何改變它以確保它有效果? – DaPhil 2015-02-09 12:13:19

+0

更改不是本地變量的值的值?看看'Test :: f()'。它在做什麼?沒有。 – juanchopanza 2015-02-09 12:14:09

回答

1

如果你真的想要這樣顛覆const正確性,那麼你必須通過引用傳遞(這樣你可以修改變量,而不是本地副本),並使用邪惡的轉換繞過類型系統對這種瘋狂的保護。

void Test::f(int const &target){ 
    const_cast<int&>(target) = 10; 
}; 

如果引用綁定到const對象,這將會有未定義的行爲。

通常,成員函數自己訪問私有變量會更有意義;並且最好通過「getter」函數而不是引用來提供只讀訪問,因爲它不會在對象中佔用額外的存儲空間。

(同樣,你不應該使用reserved names__CPP_Playground__test__

0
void f(int target); 

您正在將參數target定義爲按值傳遞,即作爲副本。因此,在f()內更改target將不會影響您傳遞給f()的變量。

爲了能夠修改傳遞給函數的對象,該函數需要將該對象作爲參考。要聲明f()採取參考參數:

void f(int& target); 

現在你可以修改傳遞給f()函數內部的變量,它也將改變功能之外。


cout << test.x << endl; // Should be 0. 

假。您尚未初始化x_,因此test.x的值可以是任何值。它是未定義的。


test.f(test.x); 

這將導致一個錯誤限定f()接受參考變量之後,因爲test.xconst(即,它不能被修改)和f()需要一個非const參考。