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

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.86
-MefistofeL-
21 / 19 / 1
Регистрация: 11.02.2009
Сообщений: 383
#1

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

26.11.2009, 12:00. Просмотров 3573. Ответов 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"
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2009, 12:00     Переплетение классов: объявление и инициализация
Посмотрите здесь:
C++ Объявление и инициализация переменных
Объявление и инициализация динамической матрицы C++
Основные типы данных, объявление и инициализация переменных C++
C++ Объявление ,инициализация ы вывод на экран двусторонней очереди
Сборка проекта, объявление и инициализация конструкторов в одном месте C++
Чем отличается между собой объявление, инициализация и определение? C++
С++, объявление классов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Sekt
156 / 155 / 10
Регистрация: 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: ето ставится.
-MefistofeL-
21 / 19 / 1
Регистрация: 11.02.2009
Сообщений: 383
26.11.2009, 12:58  [ТС]     Переплетение классов: объявление и инициализация #3
это по идеи без разницы куда ставица))
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
26.11.2009, 13:13     Переплетение классов: объявление и инициализация #4
Да, мне тоже было-бы интересно, как это реализовать.
А-то приходится извращаться, всякие #ifndef писать, и ссылки в классах типа *void делать.
Увы, пока поиски простого способа результата не дали...
-MefistofeL-
21 / 19 / 1
Регистрация: 11.02.2009
Сообщений: 383
27.11.2009, 22:30  [ТС]     Переплетение классов: объявление и инициализация #5
в общем проблема почти решилась удаления из заголовочных файлов проверок на повторное включение... но тут же кампилятор начал ругаться на слишком большое количество включения файлов:

fatal error C1014: слишком много включаемых файлов: глубина = 1024
-MefistofeL-
21 / 19 / 1
Регистрация: 11.02.2009
Сообщений: 383
29.11.2009, 09:54  [ТС]     Переплетение классов: объявление и инициализация #6
Господа маэстро... пожалуйста помогите!!! работа проставиает уже третьи сутки(((
Evg
Эксперт CАвтор FAQ
17536 / 5774 / 370
Регистрация: 30.03.2009
Сообщений: 15,892
Записей в блоге: 26
29.11.2009, 11:36     Переплетение классов: объявление и инициализация #7
Если честно, я суть проблемы не понял. Можно чуть поподробнее. В идеале на коротком примере
-MefistofeL-
21 / 19 / 1
Регистрация: 11.02.2009
Сообщений: 383
29.11.2009, 20:15  [ТС]     Переплетение классов: объявление и инициализация #8
в общем... у меня заголовочные файлы классов рекурсивно включаются друг в друга... как сделать так, чтобы это не выдавало ошибки глубины включения файлов (без #pragma once)
Evg
Эксперт CАвтор FAQ
17536 / 5774 / 370
Регистрация: 30.03.2009
Сообщений: 15,892
Записей в блоге: 26
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 делает то же самое или нет? Если то же самое, то тебя это не спасёт. Тогда нужны либо все исходники с сообщением об ошибке, либо сокращённый пример
-MefistofeL-
21 / 19 / 1
Регистрация: 11.02.2009
Сообщений: 383
29.11.2009, 23:18  [ТС]     Переплетение классов: объявление и инициализация #10
#pragma once делает тоже самое(((
Evg
Эксперт CАвтор FAQ
17536 / 5774 / 370
Регистрация: 30.03.2009
Сообщений: 15,892
Записей в блоге: 26
29.11.2009, 23:20     Переплетение классов: объявление и инициализация #11
Тогда покажи все исходники и текст ошибки. Хотя если выдаёт глубину подключения, возможно, что всё-таки не совсем так
-MefistofeL-
21 / 19 / 1
Регистрация: 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
Evg
Эксперт CАвтор FAQ
17536 / 5774 / 370
Регистрация: 30.03.2009
Сообщений: 15,892
Записей в блоге: 26
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"
-MefistofeL-
21 / 19 / 1
Регистрация: 11.02.2009
Сообщений: 383
29.11.2009, 23:42  [ТС]     Переплетение классов: объявление и инициализация #14
не пашет....при инициализации ругается.... хотя попробовать мона.... я подругому объявлялЖ перед всеми включениями
Evg
Эксперт CАвтор FAQ
17536 / 5774 / 370
Регистрация: 30.03.2009
Сообщений: 15,892
Записей в блоге: 26
29.11.2009, 23:44     Переплетение классов: объявление и инициализация #15
Я так понимаю, что суть ты понял. Попробуй привести всё это в порядок.. Если не получится - будем дальше смотреть
-MefistofeL-
21 / 19 / 1
Регистрация: 11.02.2009
Сообщений: 383
29.11.2009, 23:46  [ТС]     Переплетение классов: объявление и инициализация #16
появляются такие ошибки как
Ошибка 240 error C2027: использование неопределенного типа "Object" tck.cpp

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

Добавлено через 1 минуту
может включать файлы инициализации после объявления? отдельно?
Evg
Эксперт CАвтор FAQ
17536 / 5774 / 370
Регистрация: 30.03.2009
Сообщений: 15,892
Записей в блоге: 26
29.11.2009, 23:47     Переплетение классов: объявление и инициализация #17
Что такое файл инициализации? Покажи ВСЕ исходники, чтобы повторить можно было
-MefistofeL-
21 / 19 / 1
Регистрация: 11.02.2009
Сообщений: 383
29.11.2009, 23:49  [ТС]     Переплетение классов: объявление и инициализация #18
блин... там дохерища кода... вощм это tck.cpp например, где реализацие всех методов: конструкторов, диструкторов и т.д.
Evg
Эксперт CАвтор FAQ
17536 / 5774 / 370
Регистрация: 30.03.2009
Сообщений: 15,892
Записей в блоге: 26
29.11.2009, 23:53     Переплетение классов: объявление и инициализация #19
Тогда выдели короткий пример, где проявляется ошибка. Если нет возможности повторить, и нет возможности посмотреть все исходники - то сложно что-то сказать полезного
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.11.2009, 23:56     Переплетение классов: объявление и инициализация
Еще ссылки по теме:
C++ Объявление классов
C++ Объявление взаимодействующих классов
Объявление классов afxinet.h Visual C++
C++ Объявление и определение классов
C++ Объявление статических констант шаблонных классов

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

Или воспользуйтесь поиском по форуму:
-MefistofeL-
21 / 19 / 1
Регистрация: 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 ошибок
Yandex
Объявления
29.11.2009, 23:56     Переплетение классов: объявление и инициализация
Ответ Создать тему
Опции темы

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