2012-08-24 54 views
1

回到我试图获取由类的成员函数返回一个指针的地址:地址的功能

class Test{ 
    ... 
    char* d; 
    ... 
    char* getData(){ 
     return d; 
    } 
    ... 
} 

现在我试图让d的地址(假设* d有有效值):

Test t; 
char** pd = &t.getData(); 

这给出了一个语法错误,不会在VC2010上编译。我怎样才能得到成员指针变量的地址?

+1

你不行吗 - >'char ** getData(){return&d; }','char ** pd = t.getData();' –

+0

你能发布你得到的语法错误吗? – Ari

回答

0

您的getData()函数返回指针的副本。如果你想利用原来的指针成员的地址,你就必须改变它,以便它返回一个指针引用:

char *&getData() { return d; } 

(是否返回内部指针引用,并采取他们的地址是从设计的角度来看不错的想法是另外一回事。)

2

简短版本:你正在尝试取一个右值的地址,这是非法的。

稍大版本:当你做t.getData()时,*d是按值返回的。这很容易忘记,因为大多数时候,当您使用指针时,您不必担心通过值与传递引用。你只是返回指针,因为它很小。

这里,

char** pd = &t.getData(); 

t.getData的返回值是指针的副本,它是一个右值,这意味着它是暂时的,将停止表达期结束后存在。由于这个原因,你不能采用右值的地址 - 只要语句结束,它就会失效。如果你把这个地址在一个左值然而,它工作得很好:

Test t; 
char* temp = t.getData(); 
char** pd = &temp; 

这是因为现在气温是左值,你可以对自己的地址。

对于你想要做的事,虽然你可能会更好getValue()返回char**

+1

+1。你说的是真的,并且很好的解释了。但是在第二个版本的末尾提到“pd”可能包含'temp'的地址,而不是原始成员't.d'。 – jogojapan

+1

你说得对。感谢您指出了这一点! – Ari