Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> не виден конструктор вложенного класса, класс String из Страуструпа 
V
    Опции темы
Kuvaldis
Дата 23.10.2007, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 11
Всего: 61



Всем привет!
При создании вложенного класса компилятор ругаетсяЖ 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 

Это сообщение отредактировал(а) Kuvaldis - 24.10.2007, 08:21


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
JackYF
Дата 24.10.2007, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



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


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0477 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.