Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объявление свой структуры в классе TForm1 
V
    Опции темы
Нитонисе
Дата 28.12.2012, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В приватном разделе TForm1 объявляю структуру TMyStruct MyStruct. Билдер ругается с ообщением, что не знает что это за TMyStruct и сколько места под это зарезервировать. Если объявить TMyStruct *MyStruct с выделением памяти в конструкторе TForm1 и освобождением в деструкторе, то все работает. Вопрос - почему без указателя не выходит? Структура состоит из полей типа int.
PM MAIL   Вверх
Нитонисе
Дата 28.12.2012, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Сам понял. Описание класса - это некая абстракция, внутри которой не может быть объявлен объект.
PM MAIL   Вверх
artsb
Дата 28.12.2012, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



Цитата(Нитонисе @  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);
};



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Dem_max
Дата 30.12.2012, 06:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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



Я уже тыщу раз так делал


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Нитонисе
Дата 2.1.2013, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

struct TMyStruct;

Директива #include делает видимым файл с описанием структуры TMyStruct для файла с описанием класса TForm1. Вот такая схема не работает, компилятор ругается, что не знает сколько зарезервировать места для TMyStruct, являющейся членом класса TForm1. Если же в классе дать указатель на структуру TMyStruct, то против такой схемы компилятор возражений не имеет. В чем тут загвоздка?
PM MAIL   Вверх
mes
Дата 2.1.2013, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

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



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

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



--------------------
PM MAIL WWW   Вверх
borisbn
Дата 2.1.2013, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



либо так:
Код
// 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;
}



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Нитонисе
Дата 3.1.2013, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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

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

А второй вариант - с указателями, работает. Но я не хочу делать с указателями.
PM MAIL   Вверх
borisbn
Дата 3.1.2013, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



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

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



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Нитонисе
Дата 3.1.2013, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


Это сообщение отредактировал(а) Нитонисе - 3.1.2013, 17:14
PM MAIL   Вверх
mes
Дата 3.1.2013, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

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



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

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


--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 3.1.2013, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот заголовочный файл формы
Код

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

#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

PM MAIL   Вверх
mes
Дата 3.1.2013, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

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



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

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

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

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



--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 3.1.2013, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

Ну так а чего я тему-то создал? Закидывал - не работает (
PM MAIL   Вверх
mes
Дата 3.1.2013, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

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



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

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

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



--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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