2010-06-18 2 views
2
#include"iostream" 
class CMessage 
{ 
public:int a; 
     CMessage(){} 
     ~CMessage(){} 
}; 
void Testing(CMessage *f_pMessage)//l_pMessage is output parameter 
{ 
    f_pMessage = new CMessage(); 
    f_pMessage->a = 1; 
} 
int main() 
{ 
    CMessage *l_pMessage =NULL; 
    Testing(l_pMessage); 
    std::cout<<l_pMessage->a;//getting l_pMessage = NULL; 
    return 0; 
} 

Когда я назвал тестирование, то внутри тестирование f_pMessage становится инициализирован, но как только я после excuting функции тестирования он должен быть магазин в l_Pmessage, но он показывает NULL.confussed .... .проход по указателю не работает

+2

может понадобиться для форматирования кода и принимать ответы на некоторые вопросы ... – Cogwheel

+0

Пожалуйста, примите ответ, который помог вам больше всего, нажав на флажок слева ответа, поблагодарить их за то, что нашли время ответить! –

ответ

5

Прохождение указателем только позволяет вам изменять то, что находится , указанный на. Сам указатель по-прежнему передается по значению.

Поскольку вы хотите изменить указатель, вы можете либо передать указатель на указатель или взять указатель по ссылке:

void Testing(CMessage *&f_pMessage)//l_pMessage is output parameter 
{ 
    f_pMessage = new CMessage(); 
    f_pMessage->a = 1; 
} 
+1

Или, так как это C++, ссылка. –

+0

@CarlNorum - хорошая точка –

+0

thanx получил hte point – Suri

8
Testing(l_pMessage); 

На этой линии, вы передаете копию из указатель. Вам необходимо либо передать указатель на указатель или ссылку на указатель:

void Testing(CMessage *& f_pMessage)//l_pMessage is output parameter 
{ 
    f_pMessage = new CMessage(); 
    f_pMessage->a = 1; 
} 

Вы можете сделать это по-другому, используя указатель на указатель:

void Testing(CMessage **f_pMessage)//l_pMessage is output parameter 
{ 
    *f_pMessage = new CMessage(); 
    (*f_pMessage)->a = 1; 
} 

Но вы должны вызвать функцию этой путь:

Testing(&l_pMessage); 
3

Указатель сам копируется по значению.

f_pMessage = new CMessage(); 

изменяет указатель сам, а не объекта, он указывает. Попробуйте:

void Testing(CMessage *f_pMessage) 
{ 
    f_pMessage->a = 1; 
} 
int main() 
{ 
    CMessage *l_pMessage = new CMessage(); 
    Testing(l_pMessage); 
    std::cout<<l_pMessage->a; 
    return 0; 
} 

Или, если вы хотите создать объект в функцию:

CMessage *Testing() 
{ 
    CMessage *f_pMessage = new CMessage(); 
    f_pMessage->a = 1; 
    return f_pMessage; 
} 
int main() 
{ 
    CMessage *l_pMessage = Testing(); 
    std::cout<<l_pMessage->a; 
    return 0; 
} 
+0

thanx получил hte point – Suri

1

Указатель на указатель на путь или указатель ссылки

void testA(int** var) 
{ 
    *var = new int; 
    **var = 3; 
} 

void testB(int*& var) 
{ 
    var = new int; 
    *var = 3; 
} 

Использовать примерно так:

// Method a 
int* a; 
testA(&a); 
std::cout << "a: " << *a << "\n"; 

// Method b 
int* b; 
testB(b); 
std::cout << "b: " << *b << "\n"; 

// Dont forget to delete! 
delete a; 
delete b; 

I h Это объясняет это.

+0

thanx получил hte point – Suri

0

Ответы, которые я видел, верны, но они опустили самый важный момент, который я думаю: вы не должны использовать необработанный указатель, потому что здесь у вас нет семантики владения.

void Testing(std::unique_ptr<CMessage>& message) 
{ 
    message = std::unique_ptr<CMessage>(new CMessage()); 
    message->a = 1; 
} 

int main(int argc, char* argv[]) 
{ 
    std::unique_ptr<CMessage> l_pMessage; 
    Testing(l_pMessage); 
    std::cout << l_pMessage->a; 
    return 0; 
} 

Это лучше, потому что она использует собственную семантику, чтобы указать в коде, который отвечает за выделенный объект, а также использовать систему типов, чтобы компилятор обеспечивать правильное использование.

Теперь, я бы посоветовал другой интерфейс:

std::unique_ptr<CMessage> Testing() 
{ 
    return std::unique_ptr<CMessage>(new CMessage(1)); 
} 

int main(int argc, char* argv[]) 
{ 
    std::unique_ptr<CMessage> l_pMessage = Testing(); 
    std::cout << l_pMessage->a; 
    return 0; 
} 
Смежные вопросы