【问题标题】:Is there any way to change an outside object from inside a function有什么方法可以从函数内部更改外部对象
【发布时间】:2011-08-08 03:48:23
【问题描述】:

是否可以定义一个函数,使参数在返回后引用另一个(已经存在的)对象而不使用指针等?同样,这不能仅仅通过使用复制构造函数或赋值运算符或任何东西来更改现有对象。当函数返回时,外部对象将引用不同的内存块。

例如:

int x;
void change(int& blah) {
    blah = x; // I don't want to change blah's value to x's value, I want to make blah refer to x outside the function
}

void main() {
    int something = 0;
    change(something);
    assert(&x == &something);
}

无论使用什么方法,函数都必须像这样调用

change(x);

在调用函数之前不对参数应用任何特殊运算符或函数。我不知道这是否可能,但如果是的话,它将使非常酷的事情成为可能。如果不是,我也想知道为什么。

【问题讨论】:

  • 我不知道,我认为唯一的方法是使用指针。将变量传递给函数时,会传递变量的副本,除非您使用指针
  • 你所说的那种引用指针。指针用于“引用...内存块”。在没有指针的情况下这样做似乎是一个矛盾的要求。
  • @sje397:诸如int x 之类的非指针变量仍然指向一块内存。只是它不能指向其他任何东西,也不需要间接(因为x 那块内存,可以这么说)。
  • @Ken 是的,我也是这么想的,但如果它不能指向其他任何东西,那就是这样。不过,请参阅我对詹姆斯回答的其他评论。
  • @Ken - 我明白你的意思,我想你也明白我的意思,但如果你想了解那么多细节,我认为你的例子中的 x 指的是 contents 的内存,而指针实际上 确实 引用内存本身。

标签: c++ object-reference


【解决方案1】:

不,因为somethingx 是不同的对象。它们不指代不同的对象。它们不指向不同的对象。它们不同的对象。

要更改某物指向的位置,该某物需要是一个指针。如果你有一个指针,你可以这样做:

int x;

void change(int*& p)
{
    p = &x;
}

int main()
{
    int something = 0;
    int* pointer = &something; // pointer points to 'something'
    change(pointer);           // now pointer points to 'x'
    assert(&x == pointer);
}

【讨论】:

  • 有什么办法可以通过一些隐式转换和其他东西来完成吗?比如,可以将对象转换为指针并进行操作或其他什么?
  • @Seth:不,变量永远不能在内存中移动。
  • @Ken 好的,那么您还有其他解决此问题的方法吗?我有一个对象数组,其中一个对象具有 reference。我想让引用引用数组中的其他对象之一。那可能吗?还是没有?感谢大家的快速响应。
  • 不,您需要使用指针。初始化引用后,您无法更改引用所引用的对象。
  • @James 好的,我想这样做的原因是能够从纯虚函数返回接口的子类(但您只能使用引用或指针 b/c 来做到这一点它们是协变的)。现在,如果您有一个返回ISomething 的虚函数,是否可以返回它的子类,或者使ISomething 可扩展?还是用 C++ 完全无法解决这个问题?
【解决方案2】:

不,绝对不可能。像 int x 这样的常规变量和像 int &y(...) 这样的引用变量和数组都是不可重新安装的,即它们总是将使用/指向同一块内存。

要获得所需的功能,您确实需要使用指针或指针的抽象。否则是不可能的。

作为解释的尝试,这里是(不完全正确,并且非常简化,但足以理解这个想法):

当您声明像int x 这样的变量时,您实际上是在要求编译器将x 与特定的内存区域相关联。因此,例如,假设x 与从0x439FC2 开始的四字节相关联。由于编译器知道x 应该始终引用0x439FC2,因此x 的任何使用都可以通过查找这些内存单元并将它们加载到寄存器中、将它们推入堆栈或其他方式来真正替换。无论如何,最终结果是变量名x 几乎被数字0x439FC2 取代。所以你不能移动x的原因是你不能让那个内存地址指向内存中的不同位置。

同样,这种解释是简化的,并不完全正确,但它是推理自动分配变量的“直观”方式。

【讨论】:

  • 我希望不要浪费您的时间,但是您能给我一个完全正确且非常简单的版本吗?
  • @Seth:不幸的是,这超出了我的技能范围。
【解决方案3】:

您想使用对指针的引用:

void change(int &* blah, int * x){

  blah = x;
}

int * num1;
int num2 = 2;

change( num1, &num2 ); //num1 now points to num2

【讨论】:

    猜你喜欢
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多