在尝试设计交互式课程时,我对一些问题感到困惑。
如果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;
}
答案 0 :(得分:0)
在概念上,它取决于A
是什么。如果A
可以有效地被视为一系列int
,那么我就会在其上实施size_t size() const
和int &operator[](size_t)
(+ const
对应方) 。这些可以将他们的活动委托给v.size
和v[]
或v.at
。
在B
中,您可以定义
static void B::print_contents(A const &a)
{
for (size_t i=0; i < a.size(); i++)
std::cout << a[i] << '\n';
}
返回std::vector<int>*
的成员打破封装:您永远不能将A
的实现从std::vector<int>
更改为非常丑陋的黑客,以确保get_pointer_to_vector_in_A
仍可使用相同的语义。
答案 1 :(得分:0)
这样做的一个很好的单向方法是:
class A {
public:
void fill_vector();
int vec_size() const { return vec.size(); }
int get_data(int i) const { return vec[i]; }
};
class B {
public:
B(A &a) : a(a) { }
void init() { a.fill_vector(); }
void fetch_and_print()
{ for(int i=0;i<a.vec_size();i++) std::cout << a.get_data(i); }
private:
A &a;
};
int main() {
A a;
B b(a);
b.init();
b.fetch_and_print();
}
B类的构造函数参数是重要的位。