簡體   English   中英

課堂互動技巧

[英]Class interaction tips

嘗試設計交互類時,我為某些問題感到困惑。

如果類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是什么。 如果A可以有效地視為一個int序列,那么我將在其上實現size_t size() constint &operator[](size_t) (及其const對應項)。 這些可以將他們的活動僅委派給v.sizev[]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>*會破壞封裝:除非有非常難看的get_pointer_to_vector_in_A才能確保get_pointer_to_vector_in_A仍然可以使用相同的語義,否則您永遠都不能將A的實現從std::vector<int> get_pointer_to_vector_in_A

一種好的單向方法是:

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類的構造函數參數很重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM