2017-09-05 67 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可以隨時調用和修改該變量,你不能阻止。他們在那裏,以便可以以受控方式執行任何修改(例如,通過檢查要設置的值是否在您期望的範圍內,如果不是,或者通過重新計算取決於該值的其他一些變量你正在設置,切換對象的狀態,防止可能的數據競爭等)。