把自己弄糊涂了,指针对指针太多了
Confusing myself with too many pointers to pointers
可能重复:
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
指向与Variable3
相同的std::wstring对象。
因此,我尝试将指针Variable1
的地址传递到函数中,希望它能将Variable3
指向的地址设置到Variable1
中。
但这不起作用。它似乎设置为OK,但当程序离开func
时,Variable1仍然是一个空指针。
我试着尽可能清楚。我希望这已经足够了。不幸的是,我不能使用func的返回值,因为我实际上还有另外两个std::wstringstream
对象要做同样的事情。由于所有对象都有相同的问题,我将其简化为只有一个std::wstring
对象。我尝试过许多其他不同的&
和*
组合,但都没有成功。
非常感谢你能提供的任何帮助。
通过引用传递指针:
void func(std::wstring *& Variable2)
尽管按照其他答案的建议,还有更好的方法来完成你正在做的事情。在这种情况下使用指针是多余的。
我将跳过中间步骤。在C++中,你可以这样做:
std::string mystring;
std::string func() {
return mystring;
}
int main() {
std::string variable1 = func();
}
几句话:
- 失去指针。它们在这里没有帮助,只是增加了复杂性
- 要修改参数,请通过引用传递(但我还没有这样做(
- 不要修改参数。而是返回值
- 除了与WinAPI接口之外,不要使用
std::wstring
如果您需要共享对同一基础字符串的引用,因为您想通过
main
中的变量透明地修改它(而且只有这样!(,请返回引用而不是副本:std::string& func() { return mystring; }
…但无论如何,这可能是一个坏主意:如果
func
确实是一个成员函数,它通常不应该向外部世界公开内部可修改的状态,这违反了良好代码设计的几个规则。
此时您正在将Variable1
的值(即空指针值(复制到func
中,然后您正在修改该副本。因此CCD_ 22之外的CCD_ 21没有改变。对于有点倾向于指针的人来说,直接的解决方案是添加另一个间接级别。将指针传递到Variable1
,然后通过该指针对其进行修改。像这样:
func(&Variable1);
void func(std::wstring** Variable2)
{
*Variable2 = Variable3;
}
然而,这不是很好的风格。C++具有引用类型,允许您在不复制对象的情况下将对象传递到函数中,因此函数内部的对象与函数外部的对象相同。我们可以这样使用:
func(Variable1);
void func(std::wstring*& Variable2)
{
Variable2 = Variable3;
}
CCD_ 24是对指针(由&
表示(的引用。这意味着当您传递Variable1
时,它不会被复制,并且Variable2
指的是完全相同的指针。修改Variable2
也会修改Variable1
。
你应该问自己的下一个问题是"我首先需要一个指向std::wstring
的指针吗?"我不能为你回答这个问题,但通常答案是否定的。
然后neeext的问题是为什么要通过参数传递输出。这是一件非常C型的事情(但在这种情况下,即使他们也不会这么做(。这就是我们有返回值的原因。理想情况下,您的代码应该是这样的:
std::wstring Variable3 = SomeWStringObject;
int _tmain(int argc, _TCHAR* argv[])
{
std::wstring Variable1 = func();
}
std::wstring func()
{
return Variable3;
}
或者,您可能希望返回对Variable3
的引用,在这种情况下,您的func
返回类型应该是std::wstring&
。
- 在没有太多条件句的情况下,我如何避免被零除
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 错误:字符数组的初始值设定项太多
- 对象实例化调用构造函数的次数太多
- Levenshtein 两个文件的距离花费了太多时间
- 我有三个 getline,但是一旦编译,输入就太多了
- 将使用太多的纹理插值器 - 带旋转的着色器
- C/C++:socket() 创建在循环中失败,打开的文件太多
- 使用Visual Studio在虚幻引擎中创建一个新的类c ++给了我太多的错误
- 具有智能指针的多态性
- C++:数组<>初始值设定项太多
- GLib-ERROR:为GWakeup创建管道:打开的文件太多
- C++,从文件读取到结构,然后读取到向量(结构被推入向量太多次,而不仅仅是一次)
- 我会导致太多内存泄漏,以至于我的计算机无响应吗?
- ZeroMq:打开的文件太多.在同一对象上连续增长的fd使用数
- 读取串行命令花费太多时间
- 为什么我的函数无法使用指针打印多维数组的元素?
- 为什么 Boost unordered_map 在第一次插入时需要太多时间?
- 模型视图控制器- c++向量指针,太多的传递
- 把自己弄糊涂了,指针对指针太多了