Форум программистов, компьютерный форум CyberForum.ru

Связанные классы - C++

Восстановить пароль Регистрация
 
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
31.12.2012, 08:06     Связанные классы #1
Есть несколько классов,каждый объект которого имеет объект другого класса в качестве элемента данных
Это класс Dictionary,в состав которого входит элемент класса Tree и наоборот
Код не компилируется из-за того,что в файле с определением класса Dictionary есть элемент класса Tree и компилятор ругается,что нет такого класса
ExDict.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#ifndef DICTIONARY_H
#define DICTIONARY_H
 
class Tree;
class DictionaryManager;
 
#include "StdAfx.h"
#include "Tree.h"
#include "DictionaryManager.h"
 
#include<Windows.h>
 
 
class Dictionary
{
    friend class Tree;
    friend class DictionaryManager;
 
    public:
 
    Dictionary(string DictName)
    {
        CurrentDictionary = DictName;
 
        DataTree->CurrentDict = this;
    }
 
    
    bool correct(ID *id);//проверяем корректность введённого ID слова
    bool DeleteWord();//удаляем слово /ещё не реализовано!!!
    //---------------------------
 
 
    //функции для работы с данными словаря
    //---------------------------
    bool LoadData();//загрузить данные из словаря
    bool WriteData();//записать данные в словарь
    bool WriteNewPrimaryWord(DATA *New);//записываем новое основное слово
    bool WriteNewAssociatedWord(string NewAssociatedWord,unsigned int position);//записать в файл словаря новое ассоциированное слово
    bool WriteNewID(ID NewID,unsigned int position);//записать в файл словаря новый ID слова
    void SortByAlphabet(vector<DATA *> &SortedWords, TreeNode *ptr);
    void SortByPosition(map<unsigned int, DATA, less<unsigned int>> &SortedTree, TreeNode *ptr);
    //---------------------------
 
    
 
    private:
    string          CurrentDictionary;//название текущего словаря
 
    Tree *          DataTree;//дерево с данными о словах
};
 
#endif DICTIONARY_H

Tree.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#ifndef TREE_H
#define TREE_H
 
class Dictionary;
class DictionaryManager;
 
#include "StdAfx.h"
#include "TreeNode.h"
#include "ExDict.h"
 
class Tree
{
friend class Dictionary;
friend class DictionaryManager;
 
public:
    //конструктор,указываем лишь,что изначально кол-во слов равно 0
    Tree()
    {
        RootNode        = NULL;
        CurrentDict     = NULL;
        CountOfWords    = 0;
    }
    
    ~Tree()
    {
        ReleaseMemory(RootNode);
    }
 
    //вставить новый узел в древо
    int InsertNode(DATA *NewNode);
 
    //добавить новое ассоциированное слово
    int InsertAssociatedWord(
        string NewAssociatedWord,//ассоциируемое слово
        string PrimaryWord);//основное слово,к которому мы добавляем
    
    //добавить новый ID основного слова
    int InsertNewID(
        ID NewID,//новый ID
        string PrimaryWord);//основное слово,к которому мы добавляем
 
    //поиск слова
    int FindWord(
        string Word,//слово,которое ищем
        DATA *WordData);//переменная,в которую записываем информацию о найденном слове
 
    void ReleaseMemory(TreeNode *CurrentNode);//освобождаем память,выделенную для узлов дерева
 
private:
    Dictionary  *CurrentDict;//текущий словарь
    TreeNode    *RootNode;//корневой узел
    unsigned int CountOfWords;//кол-во слов в дереве
};
 
#endif TREE_H

Собственно ошибки компилятора
1>d:\projects\dictionary\dictionary\exdict.h(24): error C2027: использование неопределенного типа "Tree"
1> d:\projects\dictionary\dictionary\treenode.h(4): см. объявление "Tree"
1>d:\projects\dictionary\dictionary\exdict.h(24): error C2227: выражение слева от "->CurrentDict" должно указывать на тип класса, структуры или объединения либо на универсальный тип
1> ExMenuForDictionary.cpp
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.12.2012, 08:06     Связанные классы
Посмотрите здесь:

C++ Односвязанные и двух-связанные списки
Динамические структуры (связанные списки) C++
C++ связанные списки
Связанные списки C++
C++ Связанные списки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
31.12.2012, 09:10     Связанные классы #2
Реализацию класса в отдельный *.cpp
Или попробуйте поменять порядок включения файлов в main.cpp
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
31.12.2012, 09:29  [ТС]     Связанные классы #3
реализация в различных *.cpp файлах
попробую,может в этом дело
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
31.12.2012, 11:58     Связанные классы #4
Ну вот смотрите как получается:
Где-то включается фаил tree.h
доходим до строчки #include "ExDict.h"
включается фаил ExDict.h
доходим до #include "Tree.h", но TREE_H уже определена, поэтому ничего не включится.
продолжаем включение tree.h
Итого после препроцессора получим:
1) class Dictionary - Опережающее объявление
2) class Tree - Опережающее объявление
3) class Dictionary - Объявление класса
4) class Tree - Объявление класса.

В объявлении класса Dictionary у Вас есть конструктор:
C++
1
2
3
4
5
6
    Dictionary(string DictName)
    {
        CurrentDictionary = DictName;
 
        DataTree->CurrentDict = this;
    }
Если посмотреть на порядок включения файлов, то видно, что в пункте 3(объявление класса Dictionary) известно, что класс Tree существует, но ничего не известно про его поля и функции, т.к. его полное объявление идет далее в пункте 4. Поэтому и возникает ошибка.
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
01.01.2013, 06:22  [ТС]     Связанные классы #5
Спасибо!Вы были правы,я разместил #include "ExDict.h" в файле Tree.h после объявления класса и теперь всё замечательно
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
01.01.2013, 08:30     Связанные классы #6
Цитата Сообщение от alexey31415 Посмотреть сообщение
Спасибо!Вы были правы,я разместил #include "ExDict.h" в файле Tree.h после объявления класса и теперь всё замечательн
Всё-таки лучше выносить реализацию класса в отдельный фаил *.cpp
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
01.01.2013, 09:42  [ТС]     Связанные классы #7
так у меня и так всё в отдельных файлах *.cpp
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
01.01.2013, 12:23     Связанные классы #8
Цитата Сообщение от alexey31415 Посмотреть сообщение
так у меня и так всё в отдельных файлах *.cpp
а это что?
C++
1
2
3
4
5
6
    Dictionary(string DictName)
    {
        CurrentDictionary = DictName;
 
        DataTree->CurrentDict = this;
    }
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
02.01.2013, 01:26  [ТС]     Связанные классы #9
только конструктор и деструктор,всё остальное в отдельных файлах
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
02.01.2013, 03:43     Связанные классы #10
Цитата Сообщение от alexey31415 Посмотреть сообщение
только конструктор и деструктор,всё остальное в отдельных файлах
Ну так конструктор с деструктором тоже в *.cpp запихните
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.01.2013, 04:04     Связанные классы
Еще ссылки по теме:

Связанные списки (переделать программу) C++
Связанные списки C++
Ошибки связанные с односвязным списком C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
02.01.2013, 04:04  [ТС]     Связанные классы #11
привычка писать в объявлени класса
Yandex
Объявления
02.01.2013, 04:04     Связанные классы
Ответ Создать тему
Опции темы

Текущее время: 04:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru