-1

可能重复:
C++:将指针变量传递给函数

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

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指向相同的 std::wstring 对象作为Variable3.

所以我尝试将指针的地址传递给Variable1函数,然后我希望将地址Variable3指向设置为Variable1.

但这行不通。好像设置OK了,但是当程序离开的时候func,Variable1还是一个空指针。

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

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

4

3 回答 3

4

通过引用传递指针:

void func(std::wstring *& Variable2)

尽管按照其他答案的建议,有更好的方法来完成您正在做的事情。在这种情况下使用指针是非常多余的。

于 2012-12-22T14:02:55.973 回答
2

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

std::string mystring;

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

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

几点说明:

  • 失去指针。他们在这里没有帮助,他们只是增加了复杂性。
  • 要修改参数,请通过引用传递它(但我没有这样做)。
  • 不要修改参数。而是返回值。
  • 不要使用std::wstringexcept 与 WinAPI 交互。
  • 如果您需要共享对相同底层字符串的引用,因为您想通过变量 in 透明地修改它main(并且只有这样!),请返回引用而不是副本:

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

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

于 2012-12-22T14:13:02.717 回答
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&

于 2012-12-22T14:07:31.973 回答