首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >课堂互动技巧

课堂互动技巧
EN

Stack Overflow用户
提问于 2011-03-27 22:30:31
回答 2查看 1.2K关注 0票数 1

在尝试设计交互类时,我对一些问题感到困惑。

如果A类需要来自B类的一些数据,无论是指针形式还是标准容器格式(或者让我们变得更加雄心勃勃,比如以一些shared_ptr成员的形式使用stl容器),我的方法是使用一个返回相同类型参数的函数,并设计具有一致参数的B类方法?对于设计交互类和在这些类之间共享数据,是否有一个通用的经验法则?你能为一些在实践中经常遇到的常见情况画出一个通用的方案吗(并附一些例子)?我想我应该在C++中阅读一些关于类交互的例子,对此有什么建议吗?

一个小样本可以是:

代码语言:javascript
复制
#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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-27 22:39:45

从概念上讲,这取决于A是什么。如果A可以被有效地看作是int的序列,那么我会在它上面实现size_t size() constint &operator[](size_t) (+它的const副本)。它们可以将自己的活动委托给v.sizev[]v.at

B中,您可以定义

代码语言:javascript
复制
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>*的成员破坏了封装:您永远不能改变std::vector<int>以外的A实现,除非使用非常丑陋的技巧来确保get_pointer_to_vector_in_A仍然使用相同的语义。

票数 0
EN

Stack Overflow用户

发布于 2011-03-28 05:05:07

这样做的一个很好的单向方法是:

代码语言:javascript
复制
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的构造函数参数是最重要的部分。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5449867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档