2014-11-28 3 views
0

Привет, может кто-нибудь объяснить, почему следующий вызов по значению?Почему это вызов по значению, хотя я передаю указатель?

Я думал, что когда я передаю клиенту переменной переменной GetClient, это будет вызов по ссылке. Но, дебютировав код, я показал, что установлен только параметр GetClient, и после выхода из него клиент, объявленный в основном, по-прежнему пуст.

Как мне определить GetClient(), чтобы он правильно установил мою клиентскую переменную? главный

int main() 
{ 
    Example::A a; 
    Example::B b; 
    Example::B* client = 0; 
    a.SetClient(1,&b); 
    a.GetClient(1,client); 
    if(client != 0) 
    { 
     std::cout<<"OK"<<std::endl; 
    } 
} 

класс А

namespace Example 
{ 
class A 
{ 
public: 
    void A::SetClient(int key, B* client) 
    { 
     clients[key] = client; 
    } 
    void A::GetClient(int key, B* client) 
    { 
    client = clients[key]; 
    } 
private: 
    B* clients[10]; 
}; 
} 

класс B

+0

параметр 'под клиента в' ЕОКП Функция lient' не имеет никакой цели и ничего не делает. –

+0

Это ** не ** минимальный пример. Минимальным примером может быть нечто вроде 'void f (int a) {a = 10; } int main() {int n = 0; е (п); std :: cout << n << '\ n'; } ' –

+0

Потому что вы ничего не передаете по ссылке. Вы передаете указатели по значению. – juanchopanza

ответ

0

Вы передаете указатели от копирования, поэтому их изменение в функции не изменяет исходные переданные параметры. Если вы хотите передать их по ссылке, чтобы иметь возможность изменять оригиналы, используйте следующий синтаксис:

void A::GetClient(int key, B*&client) { 
    client = clients[key]; 
} 

client является ссылкой на указатель на B.

+0

Спасибо, это было полезно. –

3

Указатель представляет собой ссылку на объект B, а не ссылку на переменную client. Если вы хотите ссылку на переменную client вы можете:

(1) Используйте оператор & на функцию:

void A::GetClient(int key, B* & client) 
{ 
    client = clients[key]; 
} 

(2) Или передать указатель на переменную:

void A::GetClient(int key, B** client) 
{ 
    *client = clients[key]; 
} 

и передать указатель переменной:

a.GetClient(1, &client);