Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Объявление свой структуры в классе TForm1


Автор: Нитонисе 28.12.2012, 15:52
В приватном разделе TForm1 объявляю структуру TMyStruct MyStruct. Билдер ругается с ообщением, что не знает что это за TMyStruct и сколько места под это зарезервировать. Если объявить TMyStruct *MyStruct с выделением памяти в конструкторе TForm1 и освобождением в деструкторе, то все работает. Вопрос - почему без указателя не выходит? Структура состоит из полей типа int.

Автор: Нитонисе 28.12.2012, 16:18
Сам понял. Описание класса - это некая абстракция, внутри которой не может быть объявлен объект.

Автор: artsb 28.12.2012, 16:35
Цитата(Нитонисе @  28.12.2012,  16:18 Найти цитируемый пост)
внутри которой не может быть объявлен объект. 

Ерунда. У меня работает:
Код

struct TMyStruct
{
    int a1;
    int a2;
    int a3;
    int a4;
    int a5;
};
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
private:    // User declarations
    TMyStruct MyStruct;
public:        // User declarations
    __fastcall TForm1(TComponent* Owner);
};

Автор: Dem_max 30.12.2012, 06:19
Я уже тыщу раз так делал

Автор: Нитонисе 2.1.2013, 11:12
Да, действительно работает, но только если описание структуры привести непосредственно в файле с описанием класса TForm1. Я хотел все такие структуры вынести в отдельный файл и в файле с классом TForm1 привел только такую строчку
Код

struct TMyStruct;

Директива #include делает видимым файл с описанием структуры TMyStruct для файла с описанием класса TForm1. Вот такая схема не работает, компилятор ругается, что не знает сколько зарезервировать места для TMyStruct, являющейся членом класса TForm1. Если же в классе дать указатель на структуру TMyStruct, то против такой схемы компилятор возражений не имеет. В чем тут загвоздка?

Автор: mes 2.1.2013, 13:36
Цитата(Нитонисе @  2.1.2013,  10:12 Найти цитируемый пост)
Директива #include 

включение(инклуд)  должен быть до описания класса формы ..

Автор: borisbn 2.1.2013, 14:07
либо так:
Код
// my_struct.h
struct MyStruct {
    int a;
    int b;
    int c;
};

// TForm1.h
#inlcude "my_struct.h"
class TForm1 : public TForm
{
...
private:    // User declarations
    TMyStruct MyStruct;
...
};


либо так:
Код
// my_struct.h
то же самое

// TForm1.h
struct TMyStruct;
class TForm1 : public TForm
{
...
private:    // User declarations
    TMyStruct * MyStruct;
...
};
// TForm1.cpp
#include "my_struct.h"
void TForm1::foo() {
    MyStruct = new TMyStruct;
    MyStruct.a = 42;
}

Автор: Нитонисе 3.1.2013, 16:43
borisbn, первый вариант не срабатывает. Сообщение компилятора:
Код

[BCC32 Error] Unit1.h(157): E2303 Type name expected

Курсор при этом в строчке, в которой моя структура прописана в классе. То есть компилятор не понимает что такое TMyStruct.

А второй вариант - с указателями, работает. Но я не хочу делать с указателями.

Автор: borisbn 3.1.2013, 17:03
Нитонисе, пардон. я опечатался
должно быть так
Цитата(borisbn @  2.1.2013,  14:07 Найти цитируемый пост)

// my_struct.h
struct TMyStruct {
    int a;
    int b;
    int c;
};

Автор: Нитонисе 3.1.2013, 17:13
Цитата(borisbn @  3.1.2013,  17:03 Найти цитируемый пост)
Нитонисе, пардон. я опечатался
Ну это понятно. У себя я все верно обозначил. Но не работает этот вариант. Правда у меня в структуре не int'ы, а пара bool'ов и UnicodeString'ов. Самой структуре я дал тип TFileInfo, а имя экземпляру структуры в составе класса TForm1 - FileInfo. Может какая заковыка с зарезервированными именами, хотя в варианте с уазателями все работает как надо... И кстати, у вас во втором варианте обращение к полю структуры а надо делать не через точку а через ->

Автор: mes 3.1.2013, 17:57
Цитата(Нитонисе @  3.1.2013,  16:13 Найти цитируемый пост)
Ну это понятно. У себя я все верно обозначил. Но не работает этот вариант

покажите ваш вариант, со всеми инклудами..
если перенося структуру в отдельный файл перестает работать, при этом продолжает работать как пимпл - значит напутали с инклудами.. 
либо не включили, где надо, либо круговая зависимость..(в файл со структурой инклудирована форма)..

Автор: Нитонисе 3.1.2013, 18:41
Вот заголовочный файл формы
Код

//---------------------------------------------------------------------------

#ifndef ULocalStabilityH
#define ULocalStabilityH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
#include <ExtCtrls.hpp>
#include <ImgList.hpp>
#include <Menus.hpp>
#include <ToolWin.hpp>
#include <Buttons.hpp>
#include <OleCtrls.hpp>
#include <SHDocVw.hpp>
#include <Graphics.hpp>

#include "registry.hpp"

#include "UDeclarations.h"
#include "UMain.h"
#include <Dialogs.hpp>
#include <DB.hpp>
#include <DBClient.hpp>
#include "ULocStabSettings.h"

// речь идет об этой структуре, хочу закинуть ее описание в Declarations.h
struct TFileInfo
{
    bool Open;
    bool Modify;
    UnicodeString Name;
    UnicodeString ShortName;
};

//---------------------------------------------------------------------------
class TFLocalStability : public TForm
{
__published:    // IDE-managed Components
    //...
private:    // User declarations
    TFileInfo FileInfo;
public:        // User declarations
               //...
};
//---------------------------------------------------------------------------
extern PACKAGE TFLocalStability *FLocalStability;
//---------------------------------------------------------------------------
#endif

Автор: mes 3.1.2013, 19:29
Цитата(Нитонисе @  3.1.2013,  17:41 Найти цитируемый пост)
// речь идет об этой структуре, хочу закинуть ее описание в Declarations.h

ну закидывайте, добавляйте в файл формы инклуд и показывайте, как сделали..

Добавлено через 2 минуты и 8 секунд
Цитата(Нитонисе @  3.1.2013,  17:41 Найти цитируемый пост)
Declarations.h

оффтопик, но declaration это : struct S;
а struct S {}; это уже defination.. 

Автор: Нитонисе 3.1.2013, 20:21
Цитата(mes @  3.1.2013,  19:29 Найти цитируемый пост)
ну закидывайте, добавляйте в файл формы инклуд и показывайте, как сделали..

Ну так а чего я тему-то создал? Закидывал - не работает (

Автор: mes 3.1.2013, 20:37
Цитата(Нитонисе @  3.1.2013,  19:21 Найти цитируемый пост)
Ну так а чего я тему-то создал? Закидывал - не работает ( 

1. если правильно сделать - все работает.. 
2. возможные причины Вам перечислили.. так что немного вниманиоя и усидчивости - и все получится.. 
3. если все ж не получается, почему бы не показать, что имеете, ибо телепатов тут нет...

Добавлено через 3 минуты и 12 секунд
да и вообще предоставление максимальной информации от Вас и затребование минимальных услий со стороны - в Ваших же интересах.. но никак не наоборот.. 

Автор: Нитонисе 3.1.2013, 21:09
Вот я прикладываю простой пример с абсолютно аналогичной проблемой. Он у меня не компилируется с той же ошибкой.

Автор: mes 3.1.2013, 21:13
Цитата(Нитонисе @  3.1.2013,  20:09 Найти цитируемый пост)
Вот я прикладываю простой пример с абсолютно аналогичной проблемой. Он у меня не компилируется с той же ошибкой. 


Цитата

//Unit2.h
#include "Unit1.h"

//Unit1.h
#include "Unit2.h"


как и предполагалось:
Цитата(mes @  3.1.2013,  16:57 Найти цитируемый пост)
круговая зависимость.



Автор: Нитонисе 3.1.2013, 21:27
Ну убрал я из Unit2 
Код

//Unit2.h
#include "Unit1.h"
 и ничего не изменилось. Не компилируется.

Добавлено через 13 минут и 4 секунды
Хм. Скомпилировалось. Правда почему-то не сразу. Добавил в Unit1 строчку 
Код

struct TMyStruct;
 После этого скомпилировалось. Потом эту строчку закомментировал - и снова скомпилировалось. Чудеса какие-то.

Автор: Нитонисе 3.1.2013, 21:54
В моей программе проблема также решена удалением ссылки на главную форму из файла, где объявлена структура. Спасибо за помощь  smile 

Автор: Okkynek1 6.1.2013, 15:44
Модератор: Сообщение скрыто.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)