【问题标题】:Accessing private members of class using a pointer from a different class [duplicate]使用来自不同类的指针访问类的私有成员[重复]
【发布时间】:2014-04-23 15:41:19
【问题描述】:

C++ 让我很头疼。如何访问不同类中另一个类的私有成员?下面是我的示例代码,我正在尝试访问它的成员,但我不断收到关于它是另一个类的私有成员的各种错误。

class Ex1 {
private: 
      int test1;
};

class Ex2 {
public:
      Ex2();
      void access2Ex();
private:
      Ex1 *pointer_to_Ex1;
};

我想从 Ex2 访问 Ex1 并在 Ex2 中对它做一些讨厌的事情,而讨厌的我只想能够触摸它,抚摸它,或者让它至少承认 Ex2 的存在。任何人都可以帮助我,我将不胜感激。

【问题讨论】:

  • 如果你想触摸它,为什么要把它设为私有......
  • 你的Ext1类完全没用——所有成员都是私有的,没有朋友类/函数
  • 天哪,@DieterLücking,也许他将代码剥离到与问题相关的内容。

标签: c++ class pointers containers


【解决方案1】:

类的“私有”成员(可以是 Java、C++ 或任何其他具有“公共”与“私有”概念的 OO 语言)的全部目的是让其他类无法访问它们。如果您确实希望另一个类具有访问权限,请在相关类上创建一个访问器函数/属性:

 class Ex1{
   public:
     int getTest(){ return test1; }
     void setTest(int value){ test1 = value; }
   private:
     int test1;
 }

现在,您有了一个很好的界面,您可以对其进行编程并利用面向对象的原则。

编辑:回答下面的评论

 class Ex2{
   public:
     Ex2();
     void printIt(){
       cout << pointer_to_Ex1->getTest() << endl;
     }
 }

因此,指针将能够调用它所指向的类的所有公共方法。次要建议:使用unique_ptr(参见标准库)包装该指针并控制Ex1 指针的生命周期。

【讨论】:

  • 我刚学完 C,所以 C++ 概念很难掌握。谢谢小麦。
  • @user2816227 阅读“四人帮”一书。如果您要走 OO 的道路,它会真正阐明 OO 语言的为什么。也就是说,C++ 绝不是一种严格的 OO 语言,它有更多的做事方式,会很快让你大吃一惊。我说,如果您愿意提出问题(并且偶尔会投反对票),那么您将学得很快。祝你好运!
  • 好的,现在我已经设置了我的访问器函数,Ex2如何获取信息?
  • @user2816227 查看更新。
【解决方案2】:

@Wheaties 的回答很好。不过,我建议不要简单地添加 getset 方法,而是考虑添加对类目的有意义的方法。

例如,我曾经开发过一个图书馆系统,而不是 Loan::setDueDate(date) 方法,而是 Loan::renew(date)Loan::recall(date) 方法。最初他们做了同样的事情:date_ = date,但随着时间的推移,他们独立进化,例如,renew(date) 方法可以增加renewCount_ 成员。 (比添加setRenewCount(count) 并强制调用者记住在适当的时候调用这两种方法要好得多。)

封装是面向对象的一个​​重要原则。注意它会使您的程序更可靠。禁止访问私有成员是使 ncapsulation 起作用的工具。 Setter 削弱了该工具(尽管它们比允许从“任何地方”直接访问成员要好得多。)

【讨论】:

    猜你喜欢
    • 2016-09-06
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    相关资源
    最近更新 更多