印刷地址暂时?

时间:2016-02-11 18:24:21

标签: c++

在下面的示例中,test.cpp

#include <iostream>
using namespace std;

class Rectangle {
  public:
    int w, h;
    Rectangle() : w(7), h(0) {} // constructor definition.
    Rectangle(int x, int y) : w(x), h(y) {} // constructor definition.
};


class MyClass {
  public:
    Rectangle trec;
    MyClass() {
    }
    Rectangle getRect() {
      return trec;
    }
};

int main() {
  MyClass a = MyClass();
  cout << &a.getRect() << endl;
}

...使用gcc test.cpp -o test.exe编译时出现此错误:

test.cpp: In function ‘int main()’:
test.cpp:32:22: error: taking address of temporary [-fpermissive]
   cout << &a.getRect() << endl;

我真的没有得到临时的东西 - acout运行时被实例化,所以a.trec也应该被实例化并且有一个地址,这正是getRect()返回什么? (或者在return隐式创建副本,因为返回类型定义为Rectangle而不是Rectangle*?)

无论如何,我正在尝试检查最初这样编写的代码,以及a.trec private的位置,因此getRect()是我可以在代码中使用的唯一内容 - 在这种情况下是否有机会打印a.trec的地址?

2 个答案:

答案 0 :(得分:7)

getRect()定义为

Rectangle getRect() {
  return trec;
}

即使trec不是临时的trec,实际上并不是你要归还的。由于您按值返回,因此您将复制trec并将其放入函数返回中。该副本是暂时的,你不能拿它的地址。

如果您将代码更改为

Rectangle& getRect() {
  return trec;
}

const Rectangle& getRect() {
  return trec;
}

现在我们引用a的成员,我们可以获取该引用的地址。

答案 1 :(得分:2)

os.listdir()

返回Rectangle getRect() { return trec; } 的副本。您不能保存此副本,并尝试取一个临时的地址,这是非法的。

您可以改为返回引用(或指针而不是反复),然后打印出该地址:

trec