當我試圖設計交互類時,我對一些問題感到困惑。班級互動技巧
如果一個類A需要來自類B的一些數據,無論是以指針還是標準容器格式(甚至讓我們變得更加雄心勃勃,並以一些shared_ptr成員的形式來表示stl容器),我的方法是使用返回相同類型參數的函數,並使用符合參數設計類B方法?設計交互類和共享這些類之間的數據是否有一個通用的經驗規則? 您能否爲實踐中普遍遇到的一些常見情況繪製一個通用方案(並且讚賞一些例子)?我想我應該閱讀一些關於C++中的類交互的例子,對此的任何指針也都很感激?
一個小樣本可能是:
#include <iostream>
#include <vector>
#include <iterator>
#include <cassert>
using namespace std;
class A{
public:
A(int s, int val):sz(s), val(val), v(new vector<int>){}
int fill_vector(){
for(int k=0;k!=sz;++k)
v->push_back(val);
return 0;
}
~A(){
cout << "Dtor is deleting the pointer to vector\n";
delete v;
}
vector<int>* get_pointer_to_vector_in_A(){ return v; }
private:
int sz, val;
vector<int> *v;
};
class B{
public:
B(){} // does nothing basically
int print_vector_contents_from_A(vector<int> *v_from_A) const
{
assert(!v_from_A->empty());
copy(v_from_A->begin(), v_from_A->end(),
ostream_iterator<int>(cout, "\n"));
}
};
int main()
{
A a(10, 4);
a.fill_vector();
B b;
b.print_vector_contents_from_A(a.get_pointer_to_vector_in_A());
return 0;
}
謝謝,實際上問題的根源來自於我應該以某種方式共享一些以矢量形式存在的數據。我想我理解你的觀點,對於封裝來說,然而對於這個實現,這不是一個模板類,所以即使在這種情況下,如果我使用向量,封裝就會被破壞。我的意思是,我確實通過A的功能達到了這個目的...... – 2011-03-27 14:48:21
由於您通過界面公開了實現細節,因此封裝被破壞。除了'std :: vector'以外,'A'不能有效地實現,因爲它是它的輸出。 – 2011-03-27 14:49:57
「封裝被破壞,因爲你通過接口公開實現細節」對我來說不是很清楚,我發現我使用的是std :: vector,這是封裝破壞嗎?你的意思是我應該使用一個typedef左右,或者像你在你的代碼中做的那樣,把額外的重載操作符隱藏實現細節?我想我對封裝有一個概念誤解,現在我想這很明顯。 – 2011-03-27 14:52:30