Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Где объявить структуру? чтобы она была доступна всем потомкам 
:(
    Опции темы
GrishinUS
Дата 23.11.2008, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.9.2006
Где: Самара

Репутация: нет
Всего: нет



Добрейший вечерок!

Имеется 

mainform.cpp
mainform.h

В mainform.h объявлена структура :

Код

struct iniSettings
{
        QString InOutServ;
        ...

};


В теле mainform создается объект 
obj1.cpp
в obj1.h есть
Код

#include mainform.h


Дальше в объекте obj1
создается
obj2.cpp
в obj2.h есть
Код

#include mainform.h


и т.д.

Теперь вопрос : где объявлять структуру, чтобы она была доступна всем объектам (obj1, obj2, ...)
Указанная мной схема не работает (что странно).
PM MAIL ICQ   Вверх
sQu1rr
Дата 23.11.2008, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Может я не продвинутый  програмист, но не слышал, чтобы в .cpp файле создавались объекты других .cpp файлов. Может я неправильно понял?

Если в header.h объявлена структура, и она создана и инициализирована в file.cpp, то fail2.cpp получает к ней доступ, ЕСЛИ компилируется раньше него. Так же можно использовать ключевое слово extern
header.h
Код

#pragma once
struct str {
// ***
};

file1.cpp
Код

#include "header.h"
str s; // Глобальная переменная
// ***

file2.cpp
Код

#include "header.h" // Не повердит, так как в h*.h #pragma once
extern str s; // или ничего не писать и надеяться, что file1.cpp скомпилируется первым

PM MAIL Skype GTalk   Вверх
GrishinUS
Дата 24.11.2008, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.9.2006
Где: Самара

Репутация: нет
Всего: нет



Цитата(sQu1rr @ 23.11.2008,  21:25)
Может я не продвинутый  програмист, но не слышал, чтобы в .cpp файле создавались объекты других .cpp файлов. Может я неправильно понял?

Если в header.h объявлена структура, и она создана и инициализирована в file.cpp, то fail2.cpp получает к ней доступ, ЕСЛИ компилируется раньше него. Так же можно использовать ключевое слово extern
header.h
Код

#pragma once
struct str {
// ***
};

file1.cpp
Код

#include "header.h"
str s; // Глобальная переменная
// ***

file2.cpp
Код

#include "header.h" // Не повердит, так как в h*.h #pragma once
extern str s; // или ничего не писать и надеяться, что file1.cpp скомпилируется первым

Ну как же, такие объекты создаются, например :

Код

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent, Qt::WFlags flags)
    : QMainWindow(parent, flags)
{
    ui.setupUi(this);

    // описание класса находится в файлах class1.cpp и class1.h
    class1 dlg1(this);
    dlg1.exec();
}



Уточню вопрос.

в mainwindow.h описана структура struct1

Код

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui/QMainWindow>
#include "class1.h"
#include "ui_mainwindow.h"

// вот она
struct struct1
{
    int member1;
    int member2;
};
// вот она

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0, Qt::WFlags flags = 0);
    ~MainWindow();

private:
    Ui::MainWindowClass ui;
};

#endif // MAINWINDOW_H


в коде можно определить переменную типа
(кусок mainwindow.cpp)
Код

    ...
    struct1 variable1;

    variable1.member1 = 10;
    variable1.member2 = 20;


более того, в заголовочном файле mainwindow.h можно добавить поле :

Код

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui/QMainWindow>
#include "class1.h"
#include "ui_mainwindow.h"

struct struct1
{
    int member1;
    int member2;
};

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0, Qt::WFlags flags = 0);
    ~MainWindow();

private:
    Ui::MainWindowClass ui;
// вот оно
    struct1 str1;
};

#endif // MAINWINDOW_H


все скомпилируется без проблем.

А вот если добавить поле типа struct1 объекту class1 то получается ошибка компиляции
class1.h :
Код

#ifndef CLASS1_H
#define CLASS1_H

#include "ui_dlgClass1.h"
#include "mainwindow.h"



class class1 : public QDialog, public Ui::dlgClass1

{
Q_OBJECT

public:
        class1(QWidget * parent = 0, Qt::WFlags f = 0 );
        struct1 str1; // добавили
};

#endif // CLASS1_H


error :
struct1 doesn't  name a type


Это сообщение отредактировал(а) GrishinUS - 24.11.2008, 15:45
PM MAIL ICQ   Вверх
bsa
Дата 24.11.2008, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Возможно, у тебя просто не инклюдится mainwindow.h. Например, из-за того, что в ui_dlgClass1.h определен макрос MAINWINDOW_H.
Добавь в mainwindow.h директиву #error. Если возникнет ошибка, значит инклюидится и надо искать проблему в другом месте.
PM   Вверх
GrishinUS
Дата 25.11.2008, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.9.2006
Где: Самара

Репутация: нет
Всего: нет



Цитата(bsa @ 24.11.2008,  16:35)
Возможно, у тебя просто не инклюдится mainwindow.h. Например, из-за того, что в ui_dlgClass1.h определен макрос MAINWINDOW_H.
Добавь в mainwindow.h директиву #error. Если возникнет ошибка, значит инклюидится и надо искать проблему в другом месте.

добавил -- возникает ошибка, а значит инклюдится
PM MAIL ICQ   Вверх
bsa
Дата 25.11.2008, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Посмотрел свежим взглядом и увидел причину. Смотри:
Начинаем парсить mainwindow.h, добавляем guard - MAINWINDOW_H, подключаем файл "class1.h", инклюдим mainwindow.h, так как MAINWINDOW_H уже определен, то заканчиваем парсинг mainwindow.h и переходим к объявлению class1... Но struct1 еще не определена, так как в первом mainwindow.h до нее еще не дошло.
Итак, если хочешь чтобы все было в порядке - вынеси struct1 в отдельный хидер. Или mainwindow.h не подключай class1.h, а используй предопределение.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0867 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.