2011-05-03 102 views
0

我需要一點幫助,在C++中使用指針。對不起,似乎初學者,但我真的不明白他們。我已閱讀cplusplus.com網站上的指針教程,因此請不要這樣做。C++指針幫助?

我基本上有一個變量,其中包含另一個變量的名稱,我希望通過持有人訪問該變量。我相信我需要使用指針,如果我錯了,請糾正我。

E.g.

int a; 
string b; 

a = 10; 
b = "a"; 

我需要通過變量「b」的內容訪問變量「a」。

只是爲了把這個變成更好的角度看,這是我如何使用它:

int a; 
a = 20; 

void getVar(string name) { 
    cout << name; 
} 

getVar("a"); 

但你可以看到,第5行,這將只是COUT名稱的值,在這種情況下, 「a」,但我希望它能夠輸出名稱中包含的變量的值,所以我希望它輸出「20」。

這裏的任何幫助將不勝感激。

+7

有你想要做什麼做的語言,而C++是不是其中之一。 – 2011-05-03 19:40:32

+0

是的我知道我可以在PHP中做到這一點,有沒有什麼辦法可以實現這一點,不一定非得用指針,只是最簡單的方法? – Ollie 2011-05-03 19:42:16

+0

爲什麼不通過這種方式來告訴我們你想通過訪問變量來實現什麼? – 2011-05-03 19:44:04

回答

4

如果需要一個值的名稱,否則考慮稱爲字典關聯數組和映射。標準模板庫具有std::map,您可以使用文本與值相關聯:

#include <map> 
#include <string> 

std::map<std::string, int> my_map; 

my_map["A"] = 20; 

cout << my_map["A"] << endl; 
1

Theres沒有真正的方法讓你通過名稱來訪問變量,除非你創建一種具有名稱成員的容器類。我不確定這與指針有什麼關係。

0

僅用於輸出整數的快速修復:

int a; a = 20;

void getVar(int name){ cout < < name; }

getVar(a);

如果你需要這個函數來處理任何類型的變量,那麼可以考慮一些模板函數。

編輯:下面是模板程序代碼:

#include <iostream> 
#include <string> 

using namespace std; 

template <class T> 
void getVar(T name){ 
    cout<<name<<endl; 
} 

int main() 
{ 
string x="hee"; 
int y=10; 
getVar(x);//outputs hee 
getVar(y);//outputs 10 
return 0; 
} 
+0

你的原始答案是沒有意義的。你有編譯和測試它嗎?另外,OP需要通過名稱引用變量,而不僅僅是值。你所有的代碼都可以被簡單的'cout'語句替換;而不使用模板。 – 2011-05-03 19:51:12

2

你在想什麼的被稱爲(Reflection)的C++不支持。但是,您可以使用指針訪問的是一個變量,它指出:

int a = 5; //int variable that stores 5 
int *b = &a; //int pointer that stores address of a 

(*b) = 10; //stores 10 into address that b points to (a) 

cout << a; //prints 10 
0

也許這會適合你:

int a = 5; 
class b { 
public: 
    b(int &x) { ref_ = x; } 
    int operator()(void) { return ref_; } 
private: 
    int &ref_; 
} 

b my_b(a); 
my_b() /* -> 5 */; 
0

您的代碼不使用指針。你試圖把一個字符串轉換成一個標識符並打印出結果,我不知道這是否可行。如果你打算使用指針您的代碼應該已經是這樣的:

int a = 20; 
int* b = &a; 
cout << *b; 
1

什麼你問的是所謂「反思」或者「內省」 - (使用設計時的名稱爲程序的對象的能力類,變量,函數等)。 C++不支持開箱即用 - 設計時的名稱在編譯時被剝離。

有一些庫在C++中提供這種功能;但也有語言反映是語言的一部分。例如Python或JavaScript。

2

你試圖實現的是不可能的編譯語言(不考慮反射)。您可以使用地圖數據結構來完成類似的事情。

theMap["a"] = 20; 

和對應

void getVar(string key){ 
    cout << theMap[key]; 
} 

可與

getVar("a"); 

注被稱爲,在該極簡單的樣品theMap具有在範圍爲功能,如在類或一個名字空間。

如果您使用指針,那麼您只是使用間接級別而不適合您的示例。例如查看Chads答案。

+0

+1這張地圖就是我想要建議的,但我懶得打出來。 – 2011-05-03 19:50:30