我試圖實現深度優先搜索作爲一個函數,它接受一個圖形並輸出DFS。如何在不違反封裝的情況下合法訪問和修改私有字段矢量和地圖?
class Graph
{
private:
int V;
int timestamp;
std:: vector<std:: list<int> > graph;
std:: map<int, vertex> nodemap;
public:
Graph(int V);
int Size();
void addEdge(int u, int v);
void printEdges();
void printVertices();
};
以上是我爲圖形所做的類。我正在嘗試創建一個函數,該函數返回指向專用矢量和地圖的指針,以便我可以執行的循環對圖的鄰接列表和Map數據結構的操作。但是,我知道直接操作數據結構是對封裝的違反,我想維護我的程序的面向對象的規範。如何在不違反封裝的情況下這樣做?
PS:我不期待使用朋友函數,因爲我不想讓該函數成爲例外。我想找到一個由程序員普遍使用的主流解決方案,並且是一個有紀律的解決方案。如果需要,我可以更改我的Class字段/可訪問性。
謝謝你的時間!
你能有一個'public'函數返回'map'和'vector'的副本?假設調用者不需要修改元素,那麼這樣做不應該有問題。 – Tas
您可以將(const)迭代器返回到每個序列的begin()和end(),這將允許迭代,但不允許插入或刪除。不幸的是,它不提供'std :: map'的查找。 –
調用者確實需要修改元素。 –