ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
12 мая
25644 Топик полностью
Ecole (08.04.2005 17:00, просмотров: 1) ответил Сергей Борщ на Дык в реализации и вопрос. Как хотя бы должен выглядеть CBase?
Не, ну мне правда лень... Я в двух словах не смогу объяснить перегрузку операторов Но могу для затравки кинуть пример класса. Вот:
//файл Str.h
#ifndef _CPR_STR_H__
#define _CPR_STR_H__
//-------------------------
//V1.00         29 Apr 2003
//(c)Shkola I.
//-------------------------

class CStr {
public:
  CStr();
  ~CStr();

  WCHAR* operator = (WCHAR* sVal);
  operator WCHAR* ();
  CHAR* operator = (CHAR* sVal);
  operator CHAR* ();

private:
  void StoW();
  void WtoS();

  WCHAR *m_ws;
  CHAR  *m_s;
  static HANDLE m_hHeap;
  static int    m_iCnt;
  int    m_iLenWS, m_iLenS;
};

#endif


//Файл Str.cpp
#include 
#include 
#include "Str.h"

#define MAlloc(size)    HeapAlloc(m_hHeap,HEAP_ZERO_MEMORY,(size))
#define MFree(ptr)      HeapFree(m_hHeap,0,(ptr))
#define slenA           lstrlenA
#define slenW           lstrlenW
#define scpyA           lstrcpyA
#ifndef _UNICODE
#define scpyW(s1,s2)    CopyMemory((s1),(s2),(slenW(s2)+1)*2)
#endif

HANDLE CStr::m_hHeap=NULL;
int    CStr::m_iCnt=0;

CStr::CStr()
{
  m_ws=NULL;
  m_s=NULL;
  m_iLenWS=m_iLenS=0;
  if(!m_hHeap) m_hHeap=HeapCreate(0,0,0);
  m_iCnt++;
}

CStr::~CStr()
{
  if(m_s)  MFree(m_s);
  if(m_ws) MFree(m_ws);
  m_iCnt--;
  if(m_iCnt<1 && m_hHeap)
  {
    HeapDestroy(m_hHeap);
    m_hHeap=NULL;
  }
}

WCHAR* CStr::operator = (WCHAR* sVal)
{
  int len=((slenW(sVal)+1) & 0x0fffffc0) + 0x40;

  if(len>m_iLenWS)
  {
    if(m_ws) MFree(m_ws);
    m_ws=(WCHAR*)MAlloc(len*sizeof(WCHAR));
  }
  if(m_ws)
  {
    scpyW(m_ws,sVal);
    m_iLenWS=len;
  }
  else
  {
    m_iLenWS=0;
  }

  return m_ws;
}

CStr::operator WCHAR* ()
{
  if(m_ws) return m_ws;
  if(m_s) StoW();
  return m_ws;
}

CHAR* CStr::operator = (CHAR* sVal)
{
  int len=((slenA(sVal)+1) & 0x0fffffc0) + 0x40;

  if(len>m_iLenS)
  {
    if(m_s) MFree(m_s);
    m_s=(CHAR*)MAlloc(len);
  }
  if(m_s)
  {
    scpyA(m_s,sVal);
    m_iLenS=len;
  }
  else
  {
    m_iLenS=0;
  }

  return m_s;
}

CStr::operator CHAR* ()
{
  if(m_s) return m_s;
  if(m_ws) WtoS();
  return m_s;
}

void CStr::StoW()
{
  if(!m_s) return;
  if(m_ws && m_iLenWS WCHAR*
  if(MultiByteToWideChar(CP_ACP,0,m_s,-1,m_ws,m_iLenWS)==0)
    m_ws[0]=0;
}

void CStr::WtoS()
{
  if(!m_ws) return;
  if(m_s && m_iLenS CHAR*
  if(WideCharToMultiByte(CP_ACP,0,m_ws,-1,m_s,m_iLenS,NULL,NULL)==0)
    m_s[0]=0;
}

//А вот так этот класс может использоваться:
//Файл main.cpp
#include 
#include 
#include 
#include "Classlib\Include\Str.h"

void main()
{
  CStr s1;
  WCHAR *ws1;

  s1="Test";
  ws1=s1;

  printf("Hello, %s\n", (char*)s1);
}
Этот пример, конечно, далеко не для микроконтроллера, но он дает общее представление о том, как делается перегрузка оператора. Если разберешься в примере, свою задачу тебе будет решить легче.