【问题标题】:Return a pointer from a function to an object initialized in main()从函数返回指向在 main() 中初始化的对象的指针
【发布时间】:2015-11-02 22:38:19
【问题描述】:

我已经为这个问题苦苦挣扎了几个小时,我已经搜索了每一个对我有意义的术语。我什至可能已经阅读了相关的答案,但没有认出它,因为我对指针有点困惑。

所以,我有一个结构,它是一个对象的一部分,它是一个对象链的一部分,该对象链“锚定”(如果你可以这么称呼它)在另一个对象中,它本身就是一个链的一部分,即“锚定”在 main 中初始化的锚对象中。

struct values
{
    double val, ues;
}
class small
{
    public:
        values vals;
}
class big
{
    public:
        small *small_anchor;
}
values &getPointerToStruct(big *con)
{
    values *return_vals;
    if(con->small_anchor->vals.val==10)
        return_vals=con->small_anchor->vals;
    return (&return_vals);
}
int main()
{
    values *main_values=NULL;//This is supposed to be pointing to the "vals" struct contained inside the "small" object.
    big *big_anchor;
    big_anchor = new big;
    big_anchor->small_anchor = new small;
    big_anchor->small_anchor->vals.val=10;
    big_anchor->small_anchor->vals.ues=5;

    main_values = getPointerToStruct(&big_anchor);//now main_values should be pointing to the "vals" struct
    //I want to manipulate the value INSIDE the object itself
    main_values.val++;
}

我已经尝试了&* 的所有组合,但我没有想出任何前缀,但没有什么能给出我希望的结果。我得到的“最接近”是将“vals”(从对象内部)复制到“main_values”中,以便我可以操纵那里的值,这对我没有任何用处,因为我想操纵变量的源。

另外请注意,我省略了向下滚动链以到达我试图到达的对象的过程,并且“return_vals”似乎是任意的,但碰巧有两个可能的候选者可能是我的结构程序正在寻找,“return_vals”包含迄今为止找到的最佳候选者,当找到更好的候选者时被覆盖,或者在例程结束时返回。

【问题讨论】:

  • 使用return *return_vals 你实际上实例化了values的一个实例并将指针分配给return_vals,否则你会得到UB。
  • "我已经尝试了&* 的所有组合" - 你做错了

标签: c++ pointers object struct return


【解决方案1】:

你写的

values &getPointerToStruct(big *con)
{
    values *return_vals;
    if(con->small_anchor->vals.val==10)
        return_vals=con->small_anchor->vals;
    return (&return_vals);
}

我认为你想要的地方

values *getPointerToStruct(big *con)
{
    values *return_vals = 0;
    if(con->small_anchor->vals.val==10)
        return_vals=&con->small_anchor->vals;
    return (return_vals);
}

但是main_values.val++; 中的. 无论如何都是错误的。您需要始终如一地确定您想使用values* 还是values&。如果您愿意,您可以使用 values& 完成所有这些工作,但是 main_values 应该是 values& 并且在您准备好初始化它之前不要声明。 return_vals 不像 values& 那样实用,因为规定的要求是完整代码给它一个暂定地址,稍后有条件地对其进行修改。但是即使将return_vals 用作values*,如果这是您喜欢的,您仍然可以返回values&

【讨论】:

  • 完全成功了。另外,我感谢您在更正示例下方给出的更高级的解释。
猜你喜欢
  • 2011-05-11
  • 2013-06-30
  • 2014-03-14
  • 2016-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
相关资源
最近更新 更多