您的位置:首页 > 编程语言 > C语言/C++

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

2014-08-02 16:02 183 查看

#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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐