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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
#1

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

31.12.2012, 08:06. Просмотров 846. Ответов 10
Метки нет (Все метки)

Есть несколько классов,каждый объект которого имеет объект другого класса в качестве элемента данных
Это класс 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++
Изучаю книгу Джесс Либерти(в частности эту главу в данный момент) #include &lt;iostream&gt; class Point { public: void SetX(int...

Программа по классам, которая использует классы точек и прямых на плоскости, а, возможно, и другие классы - C++
Нужно написать программу, которая использует классы точек и прямых на плоскости, а, возможно, и другие классы. Реализовать её нужно в трех...

Наследование, базовые классы и производные классы - C++
Добрый вечер.Задание: необходимо разработать поля и методы наследуемые из базового класса и собственные компоненты производных...

Классы и наследование (Создать класс 3D фигура, и производные классы шар, конус, цилиндр и куб. Создать функцию вычисления объёма.) - C++
Уважаевые, помогите написать прожку на экзамене: Создать класс 3D фигура, и производные классы шар, конус, цилиндр и куб. Создать функцию...

классы/дочерние классы/методы - C++
помогите пожалуйста! надо что выводились только учебеники. чтоб былo через GetTip. h файл class Book { protected: char...

Классы возможностей(Mixin классы) - C++
Не могу понять смысла использования mixin классов( это класс в котором есть только методы и нет членов-данных) Т.е. к примеру у нас...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Модератор
Эксперт CЭксперт С++
13153 / 7416 / 831
Регистрация: 27.09.2012
Сообщений: 18,252
Записей в блоге: 3
Завершенные тесты: 1
31.12.2012, 09:10 #2
Реализацию класса в отдельный *.cpp
Или попробуйте поменять порядок включения файлов в main.cpp
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
31.12.2012, 09:29  [ТС] #3
реализация в различных *.cpp файлах
попробую,может в этом дело
Croessmah
Модератор
Эксперт CЭксперт С++
13153 / 7416 / 831
Регистрация: 27.09.2012
Сообщений: 18,252
Записей в блоге: 3
Завершенные тесты: 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
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
01.01.2013, 06:22  [ТС] #5
Спасибо!Вы были правы,я разместил #include "ExDict.h" в файле Tree.h после объявления класса и теперь всё замечательно
Croessmah
Модератор
Эксперт CЭксперт С++
13153 / 7416 / 831
Регистрация: 27.09.2012
Сообщений: 18,252
Записей в блоге: 3
Завершенные тесты: 1
01.01.2013, 08:30 #6
Цитата Сообщение от alexey31415 Посмотреть сообщение
Спасибо!Вы были правы,я разместил #include "ExDict.h" в файле Tree.h после объявления класса и теперь всё замечательн
Всё-таки лучше выносить реализацию класса в отдельный фаил *.cpp
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
01.01.2013, 09:42  [ТС] #7
так у меня и так всё в отдельных файлах *.cpp
Croessmah
Модератор
Эксперт CЭксперт С++
13153 / 7416 / 831
Регистрация: 27.09.2012
Сообщений: 18,252
Записей в блоге: 3
Завершенные тесты: 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
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
02.01.2013, 01:26  [ТС] #9
только конструктор и деструктор,всё остальное в отдельных файлах
Croessmah
Модератор
Эксперт CЭксперт С++
13153 / 7416 / 831
Регистрация: 27.09.2012
Сообщений: 18,252
Записей в блоге: 3
Завершенные тесты: 1
02.01.2013, 03:43 #10
Цитата Сообщение от alexey31415 Посмотреть сообщение
только конструктор и деструктор,всё остальное в отдельных файлах
Ну так конструктор с деструктором тоже в *.cpp запихните
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
02.01.2013, 04:04  [ТС] #11
привычка писать в объявлени класса
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.01.2013, 04:04
Привет! Вот еще темы с ответами:

Классы, включающие другие классы - C++
Столкнулся вот с таким кодом: #include &lt;iostream&gt; class Point { public: void SetX(int x) {itsX = x;} void SetY(int y) ...

Связанные списки - C++
Составить программу, работающую со связанными списками. Мы будем рассматривать связанный список как объект, содержащий связанный список...

связанные списки - C++
плиз помогите написать задачку: Запросить у пользователя число n. Построить связный список из n элементов, заполненный случайными...

Связанные списки С++ - C++
Здравствуйте, изучаю С++ и возникли проблемы с пониманием как работают списки. Вот код: #include &lt;cstdio&gt; #include &lt;cstdlib&gt; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.01.2013, 04:04
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru