Код из Essential COM Дон Бокс
От: Аноним  
Дата: 10.05.06 06:52
Оценка:
Перечитывал сабж и вижу такой код:

class _declspec(dllexport) FastString { 
    const int m_cch;
    // count of characters 
    // число символов 
    char* m_psz;
public: 
    FastString(const char *psz);
    ~FastString(void); 
    int Length(void) const;
    // returns # of characters 
    // возвращает число символов 
    int Find(const char *psz) const; 
    // returns offset - возвращает смещение 
};

//FastString::FastString(const char *psz) : m_psz(new char [strlen(psz) + 1]) 
//{ strcpy(m_psz, psz); }
FastString::FastString(const char *psz) 
: m_cch(strlen(psz)), m_psz(new char[m_cch + 1]) 
{ 
    strcpy(m_psz, psz);
}
FastString::~FastString(void) 
{ delete[] m_psz; }

//int FastString::Length(void) const 
//{ return strlen(m_psz); } 
int FastString::Length(void) const 
{ 
    return m_cch; 
} 
int FastString::Find(const char *psz) const 
{ 
    //O(1) lookup code deleted for> clarity1 
    // код поиска 0(1) удален для ясности
    return 0;
}

class _declspec(dllexport) FastStringItf { 
    class FastString; 
    // introduce name of impl. class 
    // вводится имя класса реализации 
    FastString *m_pThis; 
    // opaque pointer (size remains constant) 
    // непрозрачный указатель (размер остается постоянным) 
public : 
    FastStringItf(const char *psz); 
    ~FastStringItf(void); 
    int Length(void) const; 
    // returns # of characters 
    // возвращает число символов 
    int Find(const char *psz) const;
    // returns offset 
    // возвращает смещение 
}; 

FastStringItf::FastStringItf(const char *psz) 
: m_pThis(new FastString(psz)) 
{ assert(m_pThis != 0); } 
FastStringItf::~FastStringItf(void) 
{ delete m_pThis; } 
int FastStringItf::Length(void) const 
{ return m_pThis->Length(); } 
int FastStringItf::Find(const char *psz) const 
{ return m_pThis->Find(psz); }

ну ладно там всякие мелкие баги(скорее опечатки). Но по выделенному возник вопрос — как такое будет компилиться?
Дословно там так(4файла):
// faststring.h version 2.0 
class _declspec(dllexport) FastString { 
    const int m_cch;
    // count of characters 
    // число символов 
    char* m_psz;
public: 
    FastString(const char *psz);
    ~FastString(void); 
    int Length(void) const;
    // returns # of characters 
    // возвращает число символов 
    int Find(const char *psz) const; 
    // returns offset - возвращает смещение 
};

// FastString.cpp 
#include "faststring.h" 
#include <string.h> 

//FastString::FastString(const char *psz) : m_psz(new char [strlen(psz) + 1]) 
//{ strcpy(m_psz, psz); }
FastString::FastString(const char *psz) 
: m_cch(strlen(psz)), m_psz(new char[m_cch + 1]) 
{ 
    strcpy(m_psz, psz);
}
FastString::~FastString(void) 
{ delete[] m_psz; }

//int FastString::Length(void) const 
//{ return strlen(m_psz); } 
int FastString::Length(void) const 
{ 
    return m_cch; 
} 
int FastString::Find(const char *psz) const 
{ 
    //O(1) lookup code deleted for> clarity1 
    // код поиска 0(1) удален для ясности
    return 0;
}

// FastStringItf.h 
class _declspec(dllexport) FastStringItf { 
class FastString; 
      // introduce name of impl. class 
      // вводится имя класса реализации 
    FastString *m_pThis; 
      // opaque pointer (size remains constant) 
      // непрозрачный указатель (размер остается постоянным) 
  public : 
    FastStringItf(const char *psz); 
    ~FastStringItf(void); 
    int Length(void) const; 
      // returns # of characters 
      // возвращает число символов 
    int Find(const char *psz) const;
      // returns offset 
      // возвращает смещение 
};

// faststringitf.срр
// (part of DLL, not client)
// (часть DLL, а не клиента)
#include "faststring.h" 
#include "faststringitf.h" 
FastStringItf::FastStringItf(const char *psz) 
    : m_pThis(new FastString(psz)) 
  { assert(m_pThis != 0); } 
FastStringItf::~FastStringItf(vo1d) 
  { delete m_pThis; } 
int FastStringItf::Length(void) const 
  { return m_pThis->Length(); } 
int FastStringItf::Find(const char *psz) const 
  { return m_pThis->Find(psz); }
Re: Код из Essential COM Дон Бокс
От: Lorenzo_LAMAS  
Дата: 10.05.06 07:37
Оценка:
Я невнимательно смотрел, но вообще, если есть

class A
{
   class B;
   B * p_;
};


То тип члена p_ — B *, и этот B — это на самом деле A::B, т.е. наличие класса B в области видимости, охватывающей класс A — игнорируется, и класс B в объявлении — это вложенный класс, а не какой-то другой (A::B еще и не завершенный, к тому же). Ты про это говорил? Если да, то чтобы его пример работал как надо, следует писать предварительное объявление вне класса, либо писать class B * p_; //и тогда это не вложенный класс.
Of course, the code must be complete enough to compile and link.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.