Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > не виден конструктор вложенного класса


Автор: Kuvaldis 23.10.2007, 23:51
Всем привет!
При создании вложенного класса компилятор ругаетсяЖ class has no constructors  (для friend все гуд)
Код

//-------------------------------------------------------
#include <iostream>
//-------------------------------------------------------
class String
{
    private:
        class Srep;        // представление
        Srep*  pRep;
        class Cref {};        // ссылка на char

    public:
        class Range {};        // для исключений

        // конструкторы
        String();        // x = ""
        String(const char* p );
        String( const String & x );
        ~String();

        // операторы
        String & operator = ( const char* p );    // для строковых литералов
        String & operator = ( const String & x );
};
//-------------------------------------------------------
String::String()
{    
    pRep = new Srep( 0, "" );
}
//-------------------------------------------------------
String::String(const char* p )
{
    pRep = new Srep( strlen( p ), p );
}
//-------------------------------------------------------
// конструктор копии
String::String(const String & x )
{
    x.pRep->n++;
    pRep = x.pRep;    
}
//-------------------------------------------------------
String::~String()
{
    if( --pRep->n == 0 ) delete pRep;
}
//-------------------------------------------------------
// копирующее присваивание
String & String::operator = ( const String & x )
{
    x.pRep->n++;
    if( --pRep->n == 0 ) delete pRep;
    pRep = x.pRep;
    return *this;    
}
//-------------------------------------------------------
String & String::operator = ( const char* s )
{
    if( pRep->n == 1 )
    {
        pRep->assign( strlen( s ), s );
    }
    else
    {
        pRep->n--;
        pRep = new Srep( strlen( s ), s );
    }
    return *this;    
}
//-------------------------------------------------------
class String::Srep
{
public:
    char*  s;        // указатель на эл-ты
    int    sz;        // кол-во символов
    int    n;        // кол-во обращений

    // конструктор
    Srep( int nsz, const char* p )
    {
        n = 1;
        sz = nsz;
        s = new char[sz + 1];
        strcpy( s, p );
    }

    // деструктор
    ~Srep() { delete [] s; }

    // сделать копию, если необходимо
    Srep* get_own_copy()
    {
        if( n == 1 ) return this;
        n--;
        return new Srep( sz, s );
    }

    void assign( int nsz, const char* p )
    {
        if( nsz != sz )
        {
            delete [] s;
            sz = nsz;
            s = new char[ nsz + 1 ];
        }
        strcpy( s, p );
    }

    private:
        // защита от копирования
        Srep( const Srep & ) {}
        Srep& operator = ( const Srep & ) {} 
};
//-------------------------------------------------------
int main()
{
    return 0;
}
//-------------------------------------------------------


Не понимаю, в чем проблема.  smile 

Автор: JackYF 24.10.2007, 00:11
В конструкторе ты используешь имплементацию классa String::Srep, но компилятор о ней еще ничего не знает. Перенесли реализацию класса String::Srep перед опредением всех функций класса String, и всё заработает.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)