我在类变量和访问其内存位置的方法方面遇到一些编译器问题。我需要能够返回类变量的地址,并且我需要其他类能够读取该地址。
class A
public:
bool& getFlag();
private:
bool flag;
inline bool& A::getFlag()
{
return &flag;
}
我希望这就足够了,但我收到以下错误:
invalid initialization of non-const reference of type ‘bool&’ from an rvalue of type ‘bool*’
return &flag;
我不明白为什么它读取的是 bool* 甚至是我到目前为止所写的右值。我对 C++ 相当陌生,所以如果这是一个基本问题,请理解,哈哈。
到目前为止,我看到了两种可能的解决方案。一,定义一个变量来保存 get 函数中的地址并返回该变量,我认为这不会起作用,因为该变量将是临时的,我特别需要返回 bool&,而不是 const bool&。另一种是定义另一个类变量来保存地址并使用 get 函数返回这个新变量。我相信这会起作用,但感觉有点笨拙,我想知道是否有更好的方法,或者我在当前的实现中是否犯了一些错误,否则它会起作用。
一般来说并不是无效的,即编译器会编译这样的代码。但是,如果您返回的地址的对象是该函数的局部变量,并且您将尝试使用返回的地址来使用该对象,则可能会出现运行时后果。请注意,您将能够安全地操作指针本身,即将其作为参数传递给其他函数,将其与某些东西进行比较,减少或增加它等。但是一旦您尝试取消引用它,它很可能会指向对于一些垃圾,因为局部变量是在堆栈上分配的,并在封闭函数返回时被销毁,因此您将拥有指向已取消初始化的对象的指针,而且,该堆栈内存可以进一步重用。这是 C++ 和 C 程序中非常常见的错误来源。所以通常情况下,您不想返回局部变量的地址。我想说,从运行时的角度来看,所有其他情况(例如返回成员变量或全局变量的地址)“更有效”。至少在第一种情况(成员变量)中,直到封闭对象存在为止,指针将有效。在第二种情况(全局变量)中,直到全局变量未初始化为止,这通常是由特殊的 C++ 运行时库内部函数完成的,在程序存在时调用,因此很可能是有效的。
您遇到的错误是因为您试图在 getFlag 方法中返回指向 bool (即
bool*
)的指针作为对 bool
(即 bool&
)的引用,这不是允许。该错误消息表明您正在尝试使用右值(临时)指针初始化非常量引用。
如果你想返回对flag成员变量的引用,你应该这样做:
class A {
public:
bool* getFlag(); // Return a pointer to the bool.
private:
bool flag;
};
inline bool* A::getFlag() {
return &flag; // Return a pointer to the member variable.
}