繁体   English   中英

C ++保护访问

[英]C++ protected access

无论如何,我可以在没有继承的情况下访问类中的受保护变量。

class ClassA{
  protected:
    int varA; 
};

class ClassB{
  protected:
    ClassA objectA;

};


ClassB theMainObject;

我想通过theMainObject访问varA。

你可以做classB的朋友classA

class ClassA{
  protected:
    int varA; 

  friend ClassB;
}

但是使用访问器可能会更好,因为你没有将类耦合在一起。

class ClassA{
  int getA() { return varA;}
  void setA(int a) { varA = a; }
  protected:
    int varA; 
}

有一个访问者功能是唯一的方式,即;

public:
   int getVarA(){return varA;}

添加标准的getter / setter函数:

int ClassA::GetVarA()  
{  
    return varA;
}  
BOOL ClassA::SetVarA(int nNewVar)  
{  
    // Perform verifications on nNewVar... Return FALSE if didn't go well.  

    // We're satisfied. Set varA to the new value.  
    varA = nNewVar;  

    return TRUE;
}

friend是你的friend通过提及你想要在你想要使用的班级中作为朋友访问的班级来使用该关键词!

你不能,很可能不应该访问varA直接从theMainObject protected是一样的私立无关的类(比如你的两个例子类),所以varA有没有知名度。 使用ClassA的普通API来操纵它的状态。

如果varAClassA结果状态的一部分,并且您只需要对它的读访问权限,那么您应该为该类添加一个公共访问器:

public:
   int getVarA() const
   {
       return varA;
   }

除了使ClassB成为ClassA的朋友之外,还有一些标准和非标准的黑客可以进入ClassA内部。 你可以阅读Herb Sutter关于它们的文章

正如Mark B所提到的,Hovhannes Grigoryan提出的解决方案并不安全,可能会出现意外行为,因为ProtectedRemover和classA是无关的....

我过去曾用过这个,我觉得它可能更安全:

class ClassA
{
protected:
   int varA; 
};

class ProtectedRemover : public ClassA // now, they are related!
{
public: // <- Note this! :)
   int getA() { return varA; }
   void setA( int a ) { varA = a; }
};

class ClassB
{
protected:
   ClassA objectA;

public: // Just add two methods below

   int getProtectedVarA()
   {
      return ((ProtectedRemover)*(&objectA))->getA();
   }

   void setProtectedVarA(int i)
   {
      ((ProtectedRemover)*(&objectA))->setA(i);
   }
};

注意它没有任何风险来获得未确定的行为....但可能比ProtectedRemover和classA不相关的原始解决方案要少......如果ClassA具有属性的音调,也更容易做到!

除非你真的别无选择(不能通过让你的班级朋友修改classA或添加设置/获取者),仍然不推荐!

什么都不是真的不可能......

我认为禁止修改ClassA的定义。

这对你来说是一个棘手的方式,但我不鼓励你使用它:)

class ClassA
{
protected:
   int varA; 
};

class ProtectedRemover // magic thing
{
public: // <- Note this! :)
   int varA;
};

class ClassB
{
protected:
   ClassA objectA;

public: // Just add two methods below

   int getProtectedVarA()
   {
      return reinterpret_cast<ProtectedRemover*>(&objectA)->varA;
   }

   void setProtectedVarA(int i)
   {
      reinterpret_cast<ProtectedRemover*>(&objectA)->varA = i;
   }
};

int main()
{
   ClassB theMainObject;

   // Set protected thing.
   theMainObject.setProtectedVarA(3); 

   // Get protected thing.
   std::cout << theMainObject.getProtectedVarA() << std::endl;
}

因此,有一种方法可以访问和修改受保护/私有数据。
谁在想这是不可能的,投票;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM