用指针太多指针让自己感到困惑

时间:2012-12-22 14:01:11

标签: c++

  

可能重复:
  C++: Passing pointer variable to function

这是一个简化的代码片段,我认为它可以显示手头的问题:

std::wstring *Variable3 = &SomeWStringObject;

int _tmain(int argc, _TCHAR* argv[])
{
    std::wstring *Variable1 = NULL;
    func(Variable1);
}

void func(std::wstring *Variable2)
{
    Variable2 = Variable3;
}

现在,实际上,func是一个类的成员,Variable3也是同一个类的成员。对于这个更简单的例子,我们假设Variable3是某种全局变量。

Variable3是指向std::wstring对象的(全局变量)指针。我可以在调试器中看到它指向正确的字符串。

我最终想要的是Variable1指向与Variable3相同的std :: wstring对象。

所以我尝试将指针Variable1的地址传递给函数,我希望将地址Variable3指向Variable1

但这不起作用。它似乎设置好了,但是当程序离开func时,Variable1仍然是一个空指针。

我试图尽可能清楚。我希望这就够了。不幸的是,我不能使用func的返回值,因为我实际上还有两个std::wstringstream对象做同样的事情。由于所有问题都存在,我将其简化为一个std::wstring对象。我尝试过&*的许多其他不同组合,但都没有。

非常感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:4)

通过引用传递指针:

void func(std::wstring *& Variable2)

虽然有更好的方法来完成你正在做的事情,正如其他答案所建议的那样。在这种情况下使用指针是非常多余的。

答案 1 :(得分:2)

我将跳过中间步骤。在C ++中你可以这样做:

std::string mystring;

std::string func() {
    return mystring;
}

int main() {
    std::string variable1 = func();
}

一些评论:

  • 失去指针。他们在这里没有帮助,他们只是增加了复杂性。
  • 要修改参数,请按引用传递(但我没有这样做)。
  • 不要修改参数。改为返回值。
  • Do not use std::wstring except to interface with the WinAPI.
  • 如果 您需要共享对同一基础字符串的引用,因为您希望通过main中的变量透明地修改它(和只有这样!),返回引用而不是副本:

    std::string& func() {
        return mystring;
    }
    

    ...但无论如何这可能是一个坏主意:如果func确实是一个成员函数,它通常不应该将内部可修改状态暴露给外部世界,这破坏了良好代码设计的几个规则。

答案 2 :(得分:1)

此时您正在将Variable1(这是空指针值)的值复制到func,然后您正在修改该副本。因此,Variable1外部func不会更改。对于容易指针的人来说,立即解决方案是添加另一个间接层。将指针传递给Variable1,然后通过它进行修改。像这样:

func(&Variable1);

void func(std::wstring** Variable2)
{
  *Variable2 = Variable3;
}

然而,这不是很好的风格。 C ++具有允许您将对象传递给函数而不复制它的引用类型,因此该函数内的对象与对象外部相同。我们可以像这样使用它:

func(Variable1);

void func(std::wstring*& Variable2)
{
  Variable2 = Variable3;
}

Variable2是对指针的引用(由&表示)。这意味着当您传递Variable1时,它不会被复制,而Variable2指的是完全相同的指针。修改Variable2也会修改Variable1

您应该问自己的下一个问题是“我首先需要指向std::wstring的指针吗?”我无法为你回答这个问题,但通常答案是肯定的。

然后neeext问题是你通过参数传递输出的原因。这是一个非常C-ish的事情(但即使他们不会在这种情况下这样做)。这就是我们返回值的原因。理想情况下,您的代码看起来像这样:

std::wstring Variable3 = SomeWStringObject;

int _tmain(int argc, _TCHAR* argv[])
{
  std::wstring Variable1 = func();
}

std::wstring func()
{
  return Variable3;
}

或者您可能希望返回对Variable3的引用,在这种情况下,func返回类型应为std::wstring&