传递指针不起作用

时间:2010-06-18 05:12:33

标签: c++

#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 .....

5 个答案:

答案 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;
}