header 中的私有变量

Private Variable in header

我有一个 header 文件,里面有一个私有变量

class RoutingTableEntry
{
public:
void SetFlag (RouteFlags flag) { m_flag = flag; }
  RouteFlags GetFlag () const { return m_flag; }

private:
  RouteFlags m_flag;

}
    enum RouteFlags
    {
      VALID = 0,          //!< VALID
      INVALID = 1,        //!< INVALID
      IN_SEARCH = 2,      //!< IN_SEARCH
    };

我需要另一个 class 中 m_flag 的值。此 .cpp 具有声明变量的 header 文件。

我的疑问是我能否使用此 class 中的 m_flag,例如

test.Report (m_flag )

还是我必须使用 GetFlag ()

对于你的问题"Can i use it from this class",答案一般是肯定的。当您说从 class 中使用它时,通常意味着您正试图从 class 中定义的函数之一访问该变量。例如:

class RoutingTableEntry
{
public:
void SetFlag (RouteFlags flag) { m_flag = flag; }
RouteFlags GetFlag () const { return m_flag; }

int anotherFunction() { 
    //this is valid
    test.Report(m_flag) };
}

private:
  RouteFlags m_flag;
  TestObject test;

}

但是您的示例代码 test.Report(m_flag) 看起来您正试图调用另一个对象 test 的函数 Report。 如果您从 class 外部调用它(即在不同的范围,文件中),您需要调用 GetFlag 因为变量 m_flag 是私有成员并且只能由RoutingTableEntry.

的函数
class RoutingTableEntry
{
public:
void SetFlag (RouteFlags flag) { m_flag = flag; }
  RouteFlags GetFlag () const { return m_flag; }

private:
  RouteFlags m_flag;

}
//code in main
main() {
   RouteFlags r1,r2;
   TestObject test;

   //this is invalid.
   test.Report(m_flag)

   //this is valid
   test.Report(r1.GetFlag());
}

SetFlag 和 GetFlag 是通过 class 的实例访问 class 的私有成员的标准方法。

class RoutingTableEntry
{
    public:
        void SetFlag (RouteFlags flag) { m_flag = flag; }
        RouteFlags GetFlag () const { return m_flag; }
    private:
        RouteFlags m_flag;
}

从您提供的示例来看:

test.Report(m_flag);

上面暗示test是另外一个class实例(你不说是不是RoutingTableEntry的实例,虽然实际上并没有差异)并在尝试提供 RoutingTableEntry class.

的成员时调用名为 Report() 的方法

假设test是一个完全不同的实例化class,那么将m_flag传给这个实例就会要求您有一个 RoutingTableEntry 实例来操作并调用适当的方法来获取 m_flag 值。所以你最终得到以下结果:

class RoutingTableEntry
{
    public:
        void SetFlag (RouteFlags flag) { m_flag = flag; }
        RouteFlags GetFlag () const { return m_flag; }
    private:
        RouteFlags m_flag;
};

class MyOtherClass
{
    public:
        void Report(RouteFlags flags) { ... }
};

RoutingTableEntry entry;
MyOtherClass test;
test.Report(entry.GetFlag());

由于您没有真正提供足够的信息来回答问题,我将尝试猜测您可能还想表达什么意思。如果您想使用 m_flag 而无需调用 GetFlag() 访问器方法,那么 Report() 方法将需要成为 RoutingTableEntry class。然而,使这种情况不太可能发生的是,如果 Report 是 RoutingTableEntry class 的成员,那么它就不需要将 m_flag 作为参数它已经可以直接访问它了。