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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Список и элемент со ссылкой на список, error: invalid use of incomplete type 
V
    Опции темы
Elfet
Дата 16.5.2010, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Всем привет! 

Столкнулся с проблемой. Не знаю в чём тут дело. Вот у меня есть список и элемент со списком:

Код

class MItem;
class MList
{
public:    
    typedef MItem Itemdef;
    typedef std::vector<Itemdef> Listdef;
    MList()
    {
        size = 0;
        index = 0;
    }
    MList(unsigned _size) : _list(_size)
    {
        size = _size;        
        index = 0;
    }
    inline MList & operator , (const Itemdef & v)
    {
        if(index < size)
        {
            _list[index] = v;
            index++;
        }
        else
        {
            _list.push_back(v);
            index++;
            size++;
        }
        return *this;
    }

    inline const Listdef & operator()() const { return _list;  }
    inline Listdef & operator()() { return _list; }

private:
    Listdef _list;
    unsigned size;
    unsigned index;
};

class MItem
{
public:
    enum ItemType { EMPTY, DOUBLE, LIST };

    MItem() { _type = EMPTY; }
    MItem(double d) : _double(d) { _type = DOUBLE; }
    MItem(const MList & l) : _list(l) { _type = LIST; }

    const ItemType type() const { return _type; }
    const double getDouble() const { return _type == DOUBLE ? _double : 0.0; }
    const MList getList() const { return _type == LIST ? _list : MList(); }

    bool isDouble() { return _type == DOUBLE; }
    bool isList() { return _type == LIST; }
private:
    ItemType _type;
    double _double;
    MList _list;
};


Компилятор ругается, и говорит:
Цитата
D:/Qt/Minit/MathematicaForm.h:49: error: invalid use of incomplete type 'struct MItem'
D:/Qt/Minit/MathematicaForm.h:38: error: forward declaration of 'struct MItem'

на второй конструктор: MList(unsigned _size) : _list(_size)

Что я тут не так сделал? 

Заранее спасибо!



--------------------
PM MAIL WWW Skype   Вверх
djamshud
Дата 16.5.2010, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 8
Всего: 39



В этом месте еще нет полного описания класса айтем, конструктор которого вызывается конструктором вектора. Нужно разделить на описание своего второго конструктора и его реализацию.

Добавлено через 1 минуту и 12 секунд
Реализовывать нужно естественно "ниже" определения класса айтем.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
azesmcar
Дата 16.5.2010, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 81
Всего: 211



Elfet

без описание класса можно обявлять только указатель на него.
Цитата(djamshud @  16.5.2010,  15:07 Найти цитируемый пост)
Реализовывать нужно естественно "ниже" определения класса айтем. 

тогда возникнет та же проблема с классом MList, это циклическая зависимость.
PM   Вверх
Elfet
Дата 16.5.2010, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



djamshud, ок, спасибо!  smile

Добавлено через 1 минуту и 51 секунду
Сделал это вот так:

Код


class MItem;
class MList
{
public:    
    typedef MItem Itemdef;
    typedef std::vector<Itemdef> Listdef;
    MList();
    MList(unsigned _size);

    MList & operator , (const Itemdef & v);
    inline const Listdef & operator()() const { return _list; }
    inline Listdef & operator()() { return _list; }

private:
    Listdef _list;
    unsigned size;
    unsigned index;
};

class MItem
{
public:
    enum ItemType { EMPTY, DOUBLE, LIST };

    MItem() { _type = EMPTY; }
    MItem(double d) : _double(d) { _type = DOUBLE; }
    MItem(const MList & l);

    const ItemType type() const { return _type; }
    const double getDouble() const { return _double; }
    const MList & getList() const { return _list; }

    const bool isDouble() const { return _type == DOUBLE; }
    const bool isList() const { return _type == LIST; }
private:
    ItemType _type;
    double _double;
    MList _list;
};

inline std::ostream & operator << (std::ostream & os, const MItem & it)
{
    if(it.type() == MItem::DOUBLE)    os << it.getDouble();
    else if(it.type() == MItem::LIST) os << it.getList()();
    return os;
};

// Реализации
//

MList::MList()
{
    size = 0;
    index = 0;
}

MList::MList(unsigned _size) : _list(_size)
{
    size = _size;
    index = 0;
}

MList & MList::operator ,(const Itemdef & v)
{
    if(index < size)
    {
        _list[index] = v;
        index++;
    }
    else
    {
        _list.push_back(v);
        index++;
        size++;
    }
    return *this;
}

MItem::MItem(const MList & l) : _list(l)
{
    _type = LIST;
}



--------------------
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0520 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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