c++ 1对多关系类,原创注明元元,否则会打击原创者的信心啊



#pragma once
#include <memory>
#include <list>
#include <algorithm>

class N_class{
public:
 friend struct finder_N_class;
 //friend class relation_class;
 const CString& get_value(void)const
 {
  return m_TBLName;
 }
 N_class& operator =(const N_class& N_obj)
 {
  m_TBLName=N_obj.m_TBLName;
  return *this;
 }
 N_class(const N_class& N_obj)
 {
  m_TBLName=N_obj.m_TBLName;
 };
 N_class(const CString& TBName)
 {
  m_TBLName=TBName;
 };
private:
 CString m_TBLName;
};
typedef struct finder_N_class
{
 finder_N_class(const std::shared_ptr<N_class>& N_obj)
 {
  m_N_obj=N_obj;
 }
 bool operator()(std::shared_ptr<N_class> p)
 {

  return (m_N_obj->m_TBLName == p->m_TBLName);
 }
 std::shared_ptr<N_class> m_N_obj;
}finder_N_class;
class One_class
{
public:
 int iOtherTaxerCount;//没有计划好的成员,去掉并不影响这个类的功能
 friend struct finder_relation_One_class;
 //friend class relation_class;
 One_class& operator =(const One_class& One_obj)
 {
  m_TBLName=One_obj.m_TBLName;
  return *this;
 }
 One_class(const One_class& One_obj)
 {
  m_TBLName=One_obj.m_TBLName;
 };
 const CString& get_value(void)const
 {
  return m_TBLName;
 }
 One_class(const CString& TBName)
 {
  m_TBLName=TBName;
 };
private:
 CString m_TBLName;

};
 class relation_class
 {
 public:
  friend class _c_1_TO_N_relation;
  friend struct finder_relation_One_class;
  const std::shared_ptr<One_class>&  getOne(void)const
  {
   return m_one;
  }
 private:
  std::list<std::shared_ptr<N_class>> m_Ns;
  std::shared_ptr<One_class> m_one;

 };
typedef struct finder_relation_One_class
{
 finder_relation_One_class(const std::shared_ptr<One_class>& One_obj)
 {
  m_TBLName=One_obj->m_TBLName;
 }
 bool operator()(std::shared_ptr<relation_class>p)
 {

  return (m_TBLName == p->m_one->m_TBLName);
 }
 CString m_TBLName;
}finder_One_class;

class _c_1_TO_N_relation
{
public:
 int getRelationsSize(void)const
 {
  return m_relations.size();
 }
 const std::list<std::shared_ptr<relation_class>>&  getRelation(void)const
 {
  return m_relations;
 }
    const std::shared_ptr<One_class>&  getOne(const std::shared_ptr<N_class> N_obj) const;
 const std::list<std::shared_ptr<N_class>>& getNs(const std::shared_ptr<One_class>& One_obj) const;
 BOOL addRelation(const std::shared_ptr<One_class> One_obj, const std::shared_ptr<N_class> N_obj);
 _c_1_TO_N_relation(void);
 ~_c_1_TO_N_relation(void);
private:
 static const std::list<std::shared_ptr<N_class>> retNULLList;
 static const std::shared_ptr<One_class> retNULL;
 std::list<std::shared_ptr<relation_class>> m_relations;
};

#include "StdAfx.h"
#include "_c_1_TO_N_relation.h"
const std::list<std::shared_ptr<N_class>> _c_1_TO_N_relation::retNULLList=(std::list<std::shared_ptr<N_class>>)NULL;
const std::shared_ptr<One_class> _c_1_TO_N_relation::retNULL=NULL;
_c_1_TO_N_relation::_c_1_TO_N_relation(void)
{
}

_c_1_TO_N_relation::~_c_1_TO_N_relation(void)
{
}
BOOL _c_1_TO_N_relation::addRelation(const std::shared_ptr<One_class> One_obj,
 const std::shared_ptr<N_class> N_obj)
{
 try{
  std::list<std::shared_ptr<relation_class>>::iterator iter=
  std::find_if(m_relations.begin(),m_relations.end(),finder_relation_One_class(One_obj));
 if(iter!=m_relations.end())
 {
  std::list<std::shared_ptr<N_class>>::iterator iter_N=
   std::find_if((*iter)->m_Ns.begin(),(*iter)->m_Ns.end(),finder_N_class(N_obj));
  if(iter_N!=(*iter)->m_Ns.end())
  {
   return FALSE;
  }
  else
  {
   (*iter)->m_Ns.push_back(N_obj);
   return TRUE;
  }
 }
 else
 {
  std::shared_ptr<relation_class> relation(new relation_class);
  relation->m_one=One_obj;
  relation->m_Ns.push_back(N_obj);
  m_relations.push_back(relation);
  return TRUE;
 }
 }catch(...)
 {
  return FALSE;
 }
}

const std::shared_ptr<One_class>&  _c_1_TO_N_relation::getOne(const std::shared_ptr<N_class> N_obj)const
{
 
 for(std::list<std::shared_ptr<relation_class>>::const_iterator iter=m_relations.begin();
  iter!=m_relations.end();++iter)
 {
  for(std::list<std::shared_ptr<N_class>>::iterator iter_N=(*iter)->m_Ns.begin();
   iter_N!=(*iter)->m_Ns.end();++iter_N)
  {
   if((*iter_N)->get_value()==N_obj->get_value())
   {
    return (*iter)->m_one;
   }
  }
 }
 return retNULL;//这里需要改
}
const std::list<std::shared_ptr<N_class>>& _c_1_TO_N_relation::getNs(
 const std::shared_ptr<One_class>& One_obj)const
{
 for(std::list<std::shared_ptr<relation_class>>::const_iterator iter=m_relations.begin();
  iter!=m_relations.end();++iter)
 {
  if((*iter)->m_one->get_value()==One_obj->get_value())
   {
    return (*iter)->m_Ns;
   }
 }
 return retNULLList;
}

猜你喜欢

转载自blog.csdn.net/tom_xuzg/article/details/38349093