#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正在初始化但是尽快 我在激活测试功能之后应该存储在l_Pmessage中,但它显示为NULL.confussed .....
答案 0 :(得分: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);
答案 1 :(得分:5)
通过指针传递只允许您修改指向的内容。指针本身仍然按值传递。
由于您想要更改指针,您可以将指针传递给指针或通过引用获取指针:
void Testing(CMessage *&f_pMessage)//l_pMessage is output parameter
{
f_pMessage = new CMessage();
f_pMessage->a = 1;
}
答案 2 :(得分: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;
}
答案 3 :(得分: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;
我希望这可以解释它。
答案 4 :(得分: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;
}