Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.90/20: Рейтинг темы: голосов - 20, средняя оценка - 4.90
-MefistofeL-
21 / 19 / 5
Регистрация: 11.02.2009
Сообщений: 383
1

Переплетение классов: объявление и инициализация

26.11.2009, 12:00. Просмотров 3688. Ответов 26
Метки нет (Все метки)

вощм... пишу программу... есть у меня например 2 класса: Object (объект) и tck (точка) мне необходимо сделать так чтобы в объекте содеражался массив точек, а в точке - укозатель на объект к которому она принадлежит. делаю все как положенно... в программу включаю заголовочные файлы с шаблонами классов, которые включаются в фалики спп с объявлениями классов... как сделать так что бы кампилятор в инициализации одного класса не ругался на неинициализированные поля и методы другого класса?

(прадва у меня еще дофига других классов но эти два самые главные)

Object.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
#pragma once
 
 
class Object
{
    friend class tck;
    friend class NET;
    friend class speed;
    friend class force;
 
    char *name;
    
    
public:
    tck place;
    static int real_N;
    bool stat;
    int N_tck;
    float m;
    tck* contur;
    Object (float, float, float _m,int n); //центр, масса,количество точек
    ~Object();
    virtual void step ();
    virtual void step (force);
    void forr(force);
    void add(int, tck);
    virtual void drow();
    static NET** net;
    static int NET_n;
    bool operator == (Object &);
    Object *operator = (Object &);
};
tck.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
#pragma once
 
 
 
class tck
{
 
    friend class Object;
    friend class NET;
    friend class speed;
    friend class force;
 
public:
    Object* my;
    float x;
    float y;
    float z;
    float m;
    force f;
    speed v;
 
    tck (Object *t, float _x, float _y, float _z):
    x (_x),
    y (_y),
    z (_z),
    f (this),
    v (this)
    {
        my=t;
    }
 
    tck (Object*);
 
    tck()
    {
        m=1;
        my=NULL;
        f.reload(nuLL,nuLL,nuLL,this);
        v.reload(nuLL,nuLL,nuLL,this);
    }
 
    ~tck()
    {
        
    }
    void reload(float,float,float,Object*);
    void freload(float,float,float);
    tck &operator = (tck &);
    void step (float,bool);
 
    
 
};
включение файлов:

C++
1
2
3
4
5
6
#include "force.h"
#include "speed.h"
#include "Object.h"
#include "Earth.h"
#include "tck.h"
#include "NET.h"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2009, 12:00
Ответы с готовыми решениями:

С++, объявление классов
Здравствуйте товарищи. Возникла следующая проблема: пусть есть два класса: А...

Как обойти ошибку (инициализация структур/классов, имеющих свойства)
Как только структура объявлена с ключевым свойством property - так сразу...

Объявление классов afxinet.h
Доброго времени суток. У меня есть концептуальный вопрос) Вот текст...

Создание java классов в коде С++ и вызов Java методов и классов из C++
Здравствуйте! Собственно проблема вот в чем при клмпиляции получаю ошибки ...

Объявление и инициализация переменных
помогите исправить, пожалуйста.... Решение: #include <iostream.h> #include...

26
Sekt
157 / 156 / 47
Регистрация: 29.04.2009
Сообщений: 637
26.11.2009, 12:20 2
C++
1
2
3
4
  friend class tck;
        friend class NET;
        friend class speed;
        friend class force;
вроде в public: ето ставится.
0
-MefistofeL-
21 / 19 / 5
Регистрация: 11.02.2009
Сообщений: 383
26.11.2009, 12:58  [ТС] 3
это по идеи без разницы куда ставица))
0
Patch
2336 / 492 / 22
Регистрация: 01.04.2009
Сообщений: 2,181
26.11.2009, 13:13 4
Да, мне тоже было-бы интересно, как это реализовать.
А-то приходится извращаться, всякие #ifndef писать, и ссылки в классах типа *void делать.
Увы, пока поиски простого способа результата не дали...
0
-MefistofeL-
21 / 19 / 5
Регистрация: 11.02.2009
Сообщений: 383
27.11.2009, 22:30  [ТС] 5
в общем проблема почти решилась удаления из заголовочных файлов проверок на повторное включение... но тут же кампилятор начал ругаться на слишком большое количество включения файлов:

fatal error C1014: слишком много включаемых файлов: глубина = 1024
0
-MefistofeL-
21 / 19 / 5
Регистрация: 11.02.2009
Сообщений: 383
29.11.2009, 09:54  [ТС] 6
Господа маэстро... пожалуйста помогите!!! работа проставиает уже третьи сутки(((
0
Evg
Эксперт CАвтор FAQ
19305 / 7160 / 533
Регистрация: 30.03.2009
Сообщений: 20,037
Записей в блоге: 30
29.11.2009, 11:36 7
Если честно, я суть проблемы не понял. Можно чуть поподробнее. В идеале на коротком примере
0
-MefistofeL-
21 / 19 / 5
Регистрация: 11.02.2009
Сообщений: 383
29.11.2009, 20:15  [ТС] 8
в общем... у меня заголовочные файлы классов рекурсивно включаются друг в друга... как сделать так, чтобы это не выдавало ошибки глубины включения файлов (без #pragma once)
0
Evg
Эксперт CАвтор FAQ
19305 / 7160 / 533
Регистрация: 30.03.2009
Сообщений: 20,037
Записей в блоге: 30
29.11.2009, 23:15 9
Каждый файл надо обкладывать макросам. Обычно имя макроса определяют в зависимости от имени файла (хотя это непринципиально), главное чтобы для каждого файла имя было уникальным

C
1
2
3
4
5
6
7
/* Файл t1.h */
#ifndef __T1_H__
#define __T1_H__
 
Содержимое
 
#endif /* __T1_H__ */
Однако насколько я понимаю #pragma once делает то же самое или нет? Если то же самое, то тебя это не спасёт. Тогда нужны либо все исходники с сообщением об ошибке, либо сокращённый пример
0
-MefistofeL-
21 / 19 / 5
Регистрация: 11.02.2009
Сообщений: 383
29.11.2009, 23:18  [ТС] 10
#pragma once делает тоже самое(((
0
Evg
Эксперт CАвтор FAQ
19305 / 7160 / 533
Регистрация: 30.03.2009
Сообщений: 20,037
Записей в блоге: 30
29.11.2009, 23:20 11
Тогда покажи все исходники и текст ошибки. Хотя если выдаёт глубину подключения, возможно, что всё-таки не совсем так
0
-MefistofeL-
21 / 19 / 5
Регистрация: 11.02.2009
Сообщений: 383
29.11.2009, 23:24  [ТС] 12
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
//Object.h
#include "tck.h"
 
class Object
{
        friend class tck;
        friend class NET;
        friend class speed;
        friend class force;
 
        char *name;
        
        
public:
        tck place;
        static int real_N;
        bool stat;
        int N_tck;
        float m;
        tck* contur;
        Object (float, float, float _m,int n); //центр, масса,количество точек
        ~Object();
        virtual void step ();
        virtual void step (force);
        void forr(force);
        void add(int, tck);
        virtual void drow();
        static NET** net;
        static int NET_n;
        bool operator == (Object &);
        Object *operator = (Object &);
};



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
//tck.h
#include "Object.h"
 
class tck
{
 
        friend class Object;
        friend class NET;
        friend class speed;
        friend class force;
 
public:
        Object* my;
        float x;
        float y;
        float z;
        float m;
        force f;
        speed v;
 
        tck (Object *t, float _x, float _y, float _z):
        x (_x),
        y (_y),
        z (_z),
        f (this),
        v (this)
        {
                my=t;
        }
 
        tck (Object*);
 
        tck()
        {
                m=1;
                my=NULL;
                f.reload(nuLL,nuLL,nuLL,this);
                v.reload(nuLL,nuLL,nuLL,this);
        }
 
        ~tck()
        {
                
        }
        void reload(float,float,float,Object*);
        void freload(float,float,float);
        tck &operator = (tck &);
        void step (float,bool);
 
        
 
};

Добавлено через 1 минуту
Ошибка 1 fatal error C1014: слишком много включаемых файлов: глубина = 1024
0
Evg
Эксперт CАвтор FAQ
19305 / 7160 / 533
Регистрация: 30.03.2009
Сообщений: 20,037
Записей в блоге: 30
29.11.2009, 23:33 13
А... ну так ты файлы друг в друга включаешь. Так в принципе нельзя делать. А чего ты хочешь этим добиться? Если только из-за того, что классы взаимно ссылаются друг на друга, то делается так:

C++
1
2
3
4
5
6
7
8
//Object.h
 
// Предварительное объявления класса
class tck;
 
class Object
{
Далее всё как у тебя
C++
1
2
3
4
5
6
7
8
//tck.h
 
// Предварительное объявления класса
class Object;
 
class tck
{
Далее всё как у тебя
Ну а в файле *.cpp просто подключаешь оба файла

C++
1
2
#include "Object.h"
#include "tck.h"
0
-MefistofeL-
21 / 19 / 5
Регистрация: 11.02.2009
Сообщений: 383
29.11.2009, 23:42  [ТС] 14
не пашет....при инициализации ругается.... хотя попробовать мона.... я подругому объявлялЖ перед всеми включениями
0
Evg
Эксперт CАвтор FAQ
19305 / 7160 / 533
Регистрация: 30.03.2009
Сообщений: 20,037
Записей в блоге: 30
29.11.2009, 23:44 15
Я так понимаю, что суть ты понял. Попробуй привести всё это в порядок.. Если не получится - будем дальше смотреть
0
-MefistofeL-
21 / 19 / 5
Регистрация: 11.02.2009
Сообщений: 383
29.11.2009, 23:46  [ТС] 16
появляются такие ошибки как
Ошибка 240 error C2027: использование неопределенного типа "Object" tck.cpp

Добавлено через 31 секунду
это то, от чего я пытался убежать изначально

Добавлено через 1 минуту
может включать файлы инициализации после объявления? отдельно?
0
Evg
Эксперт CАвтор FAQ
19305 / 7160 / 533
Регистрация: 30.03.2009
Сообщений: 20,037
Записей в блоге: 30
29.11.2009, 23:47 17
Что такое файл инициализации? Покажи ВСЕ исходники, чтобы повторить можно было
0
-MefistofeL-
21 / 19 / 5
Регистрация: 11.02.2009
Сообщений: 383
29.11.2009, 23:49  [ТС] 18
блин... там дохерища кода... вощм это tck.cpp например, где реализацие всех методов: конструкторов, диструкторов и т.д.
0
Evg
Эксперт CАвтор FAQ
19305 / 7160 / 533
Регистрация: 30.03.2009
Сообщений: 20,037
Записей в блоге: 30
29.11.2009, 23:53 19
Тогда выдели короткий пример, где проявляется ошибка. Если нет возможности повторить, и нет возможности посмотреть все исходники - то сложно что-то сказать полезного
0
-MefistofeL-
21 / 19 / 5
Регистрация: 11.02.2009
Сообщений: 383
29.11.2009, 23:56  [ТС] 20
мля там ваще полная(((

Добавлено через 1 минуту
исходники тут не помогут....

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Object::Object(float x=0, float y=5, float _m=1,int n=1):
m(_m),
N_tck (n)
{
    real_N++;
    name= new char[1];
    name[0]=real_N;
    stat=false;
    place.reload (x,y,0,this);
    contur=new tck [N_tck]; <<ошибка тут
    for (int i=0;i<N_tck;i++)
    {
        contur[i].reload(0,5+i,0,this);
        contur[i].m=m/N_tck;
    }
}
Ошибка 194 error C2061: синтаксическая ошибка: идентификатор "tck" object_.cpp

Добавлено через 28 секунд
вот например

Добавлено через 26 секунд
таких парядка 200 ошибок
0
29.11.2009, 23:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.11.2009, 23:56

Объявление и инициализация динамической матрицы
Ребят, только начал разбираться с матрицой. примерно я знаю как написать...

Основные типы данных, объявление и инициализация переменных
ребятки, попробуйте 1) Объявить в программе переменные и константы (выбор...

Инициализация и объявление переменной
Утро доброе, class Content def zagolovok(str) counter(1) ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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