标头中的私有变量

时间:2015-10-06 23:53:47

标签: c++ private-members

我有一个头文件,其中有一个私有变量

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
    };

我需要另一个班级m_flag的值。此.cpp具有声明变量的头文件。

我怀疑是否可以使用此类中的m_flag,例如

test.Report (m_flag )

或者我必须使用GetFlag ()

2 个答案:

答案 0 :(得分:2)

对于您的问题&#34;我是否可以在此课程中使用它&#34; ,答案通常是肯定的。当你说从这个类中使用它时,通常意味着你试图从类中定义的函数之一访问该变量。例如:

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)看起来像是在尝试调用函数报告不同的对象测试。 如果从类外部(即在不同的范围,文件中)调用它,则需要调用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());
}

答案 1 :(得分:0)

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

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 是另一个类实例(尽管实际上并没有什么不同,但您不说它是否是RoutingTableEntry的实例),并且正在调用称为在尝试提供RoutingTableEntry类的成员时使用Report()。

假设 test 是一个完全不同的实例化类,然后将 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类的成员。但是,这使得不太可能的是,如果Report是RoutingTableEntry类的成员,则它不必将 m_flag 作为参数,因为它可以直接访问它。