Russian Qt Forum
Ноябрь 01, 2024, 03:08 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Обьявление классов  (Прочитано 5070 раз)
lokoArt
Гость
« : Январь 16, 2010, 09:36 »

ПРивет всем. Подскажите пожайлуста как правильно сделать.
У меня есть 2 класса, вот их коды

class1.h
Код:
class Class1{
private:
    int a;
    Class2 test;
public:
    Class1();
};

class1.cpp
Код:
#include "class1.h"


Class1::Class1(){
    a=5;
}

class2.h
Код:
#include "class1.h"


class Class2{
private:
    Class1* class1;
public:
    Class2();
};

class2.cpp
Код:
#include "class2.h"

Class2::Class2(){
    class1 = new Class1();
}

Нужно чтобы, в class1 можно было создавать объект класса class2.
Записан
BRE
Гость
« Ответ #1 : Январь 16, 2010, 10:20 »

Воспользуйся поиском по форуму на тему: Forward declaration
Записан
ilot
Гость
« Ответ #2 : Январь 16, 2010, 10:55 »

Цитировать
Нужно чтобы, в class1 можно было создавать объект класса class2.
1. в class1.h включи заголовок class2.h
2. в начало class1.h добавь объявление:
Код:
class Class2;
3. в начало class2.h добавь объявление:
Код:
class Class1;
Записан
Dendy
Гость
« Ответ #3 : Январь 16, 2010, 11:25 »

Где-то явно нарушена логика, ибо судя по коду обекты будут бесконечно создавать друг друга в конструкторах.
Записан
ilot
Гость
« Ответ #4 : Январь 16, 2010, 11:47 »

Где-то явно нарушена логика, ибо судя по коду обекты будут бесконечно создавать друг друга в конструкторах.
действительно   Улыбающийся
хотя возможно, что в class1.h опечатка и имелся ввиду указатель на Class2. В таком случае все будет нормально
Записан
BlackTass
Гость
« Ответ #5 : Январь 16, 2010, 12:45 »

1. в class1.h включи заголовок class2.h
наверно имелось в виду в class1.cpp добавить #include "class2.h" и также для для второго класса
Записан
lokoArt
Гость
« Ответ #6 : Январь 16, 2010, 12:52 »

Где-то явно нарушена логика, ибо судя по коду обекты будут бесконечно создавать друг друга в конструкторах.
 

ой действительно... я не заметил... Ну всё таки я разобрался с Forward declaration)) всем спасибо
Записан
zenden
Гость
« Ответ #7 : Январь 16, 2010, 13:34 »

Как создавать классы / хедеры так, чтобы программа компилировалась независимо от порядка директив #include ?
Записан
ilot
Гость
« Ответ #8 : Январь 16, 2010, 13:59 »

Как создавать классы / хедеры так, чтобы программа компилировалась независимо от порядка директив #include ?
1. следить, чтобы хедеры содержали только объявления без определений (исключения - inline-функции, статические функции/переменные и константы).
2. использовать флаги включения:
Код:
#ifndef MY_HEADER_H
#define MY_HEADER_H
//содержимое хедера
...
#endif //MY_HEADER_H
3. следить, чтобы все используемые в хедере типы данных были предварительно объявлены:
 - в начале хедера подключить заголовки от которых он зависит;
 - для разрешения циклических ссылок внутри хереда используются forward declaration;

Если я ничего не забыл, то этого должно быть достаточно, чтобы не обращать внимания на порядок включения заголовков в cpp-файлы.
« Последнее редактирование: Январь 16, 2010, 14:01 от ilot » Записан
BlackTass
Гость
« Ответ #9 : Январь 16, 2010, 15:51 »

3. следить, чтобы все используемые в хедере типы данных были предварительно объявлены:
 - в начале хедера подключить заголовки от которых он зависит;
 - для разрешения циклических ссылок внутри хереда используются forward declaration;
Лучше оставлять как можно меньше инклюдов в хедерах. Только то для чего нужны внутренности. Все остальное через форвард и инклюдить в цпп
Записан
niXman
Гость
« Ответ #10 : Январь 16, 2010, 17:57 »

Код
C++ (Qt)
template<typename Ty>
class class1 {
  Ty* any_class;
}
 
?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.069 секунд. Запросов: 21.