2014-11-12 4 views
2

У меня есть тест, который я определил так:возвращается нулевой указатель

ClassName FileHandle; 
ClassName1* data; //I want function to define this later 

FileHandle.getData(data); //this is null after the call but isn't in function it calls 
          //why isn't the pointer defined from the method called? How fix? 

Функция вызывается выглядит следующим образом:

void ClassName::getData(ClassName1* data) 
{ 
    char * buf = "lots of data";   
    data = new ClassName1(buf, sizeof(buf)); //it's in there 
} 

Я уверен, что это проблема с мое понимание указателей и ссылок. Любые идеи, что я делаю неправильно здесь? Почему значение, которое все еще определено, когда оно возвращается к моему тесту?

Я видел примеры указателей и вызовов функций here, но у меня возникли проблемы с поиском такого примера. This похоже, что это тоже похоже, но я все еще смущен.

+3

ли вы понять, почему 'аннулируются F (INT I) {я = 3; } void g() {int j; е (к); } 'не устанавливает' j' в '3'? Это действительно то же самое, и если вы это понимаете, это поможет получить более качественные ответы, если вы сможете объяснить разницу, которую вы видите, заставляя вас думать, что ваш пример изменяет «данные». – hvd

+1

Вы пытаетесь изменить адрес указателя, но передаете указатель по значению: P – DGomez

+0

@DGomez - Это не позволит мне вызвать getData (& data). Я попытался изменить функцию на getData (ClassName1 & data) вместе с ней, но это не позволит мне создать экземпляр нового ClassName1 в getData. – Michele

ответ

2

Пропустите сам указатель по ссылке &:

void ClassName::getData(ClassName1* &data2) 

Для ясности я переименовал переменные data1 и data2, так что вы можете увидеть, что они разные. В противном случае адрес, хранящийся в локальном указателе data2, уничтожается после завершения функции getData, и NULL-адрес, первоначально сохраненный на входе data1, остается неизменным.

Синтаксис вызова остается прежним:

FileHandle.getData(data1);