这是一个简化的代码片段,我认为它可以显示手头的问题:
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
对象。我尝试过&
和*
的许多其他不同组合,但都没有。
非常感谢您提供的任何帮助。
答案 0 :(得分:4)
通过引用传递指针:
void func(std::wstring *& Variable2)
虽然有更好的方法来完成你正在做的事情,正如其他答案所建议的那样。在这种情况下使用指针是非常多余的。
答案 1 :(得分:2)
我将跳过中间步骤。在C ++中你可以这样做:
std::string mystring;
std::string func() {
return mystring;
}
int main() {
std::string variable1 = func();
}
一些评论:
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&
。