2017-09-05 66 views
3

有一段时间我一直在想,我希望你们能分享你对这件事的看法。大约半年前,当我编写一个由PLC控制的机器人时,我首先发现了这个问题。在结构化文本中,我使用get-functions从类中返回一个对象。这样我就可以做任何我想要的类的成员/变量(使用getter和setter)。这为我节省了很多工作,因为我不必为了从一个更深层的物体中获取某些东西而做出单独的功能。获取“嵌入”变量或对象的getter是否允许/常用?

目前我正在用Qt C++进行编程,但又遇到了这个问题。我不确定我现在是否已经完全清楚(我不是英语母语的人,也不擅长编码行话),所以我会试着用一个例子说清楚。 比方说,我有一个数组/矢量与它的班级中的多个对象。每个对象都有它自己的带有类的数组(每个类都有学生,而不是编程类),每个类都有它自己的数组和学生,他们当然有名字,学号和年龄等。

Now我想获得一个随机的学生的名字。在Qt C++中,我会这样做:

QString randomName = schoolVector.at(randomNumber)->getClassVector().at(anotherRandomNumber)->getStudentVector().at(yetAgainARandomNumber)->getName(); 

你可以看到我做了一些get函数来返回某个类中的对象。这样,我可以轻松地操作类中的对象或变量。 这是我问这个问题的原因:这是要走的路吗?在学校里,他们教我使用getter和setter是很重要的,这样当你不想要或者你不想让其他人操作变量时,你就不能操纵变量。但是当我使用getter在classVector中返回一个类时,我仍然可以操纵那里的任何东西。

任何人都可以告诉我常见的做法,并且如果使用for-loops找到矢量中的某个对象是正常的吗?我真的很感激!

干杯, 马亭

+0

你可能想给这个阅读:https://stackoverflow.com/questions/32625274/public-variables-bad-practice-vs-getters-and-setters-functions – NathanOliver

+0

感谢您发送该链接!这确实看起来很像我问的问题。所以,如果我理解正确,不是每个人都对这个问题认为一致?但是当人们使用吸气剂和吸附剂时,人们会怎么做呢? – MartijnKor

+0

通常它看起来像你所拥有的。真的,尽管我认为你应该做的是在你的“学校”中有一个单独的'student_list',它包含所有已注册的学生,然后你可以简单地从该列表中选择一个随机的学生。 – NathanOliver

回答

1

如果我的理解,你希望能够访问对象(阅读),以保留封装方式。您可以通过定义

const std::vector<Class>& getClassVector() const { return class_vector; } 

现在你有accesss底层对象一个getter,它返回一个常量引用内部对象,例如:不能够修改它实现这一目标。

顺便说一句,也许它是分裂的头发,你知道它,但它不是真的,setters/getters被实现,以便人们不能修改底层变量,当你不希望他们 - 一个setter可以随时调用和修改该变量,你不能阻止。他们在那里,以便可以以受控方式执行任何修改(例如,通过检查要设置的值是否在您期望的范围内,如果不是,或者通过重新计算取决于该值的其他一些变量你正在设置,切换对象的状态,防止可能的数据竞争等)。