Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно обьявить класс в хедере?????? не получается(((( 
V
    Опции темы
Sergio
Дата 27.4.2007, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

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



Здрасте. Вот я создал в билдере File1.cpp и написал такое:
Код

 #include "File1.h"
 #include "Unit1.h"
class PrivateForm {

 private:
    String Ip;
    String Nick;

 public:
    PrivateForm() {
     }

    PrivateForm(char _Ip[15], char _Nick[15]) {
        Ip.sprintf(_Ip);
        Nick.sprintf(_Nick);

        TForm* Forma = new TForm(Application, 1);
        Forma->Width = 320;
        Forma->Height = 365;
        Forma->Left = Form1->Left + Form1->Width/2 - (Forma->Width/2);
        Forma->Top = Form1->Top + Form1->Height/2 - (Forma->Height/2);
        Forma->BorderStyle = bsSingle;
        Forma->BorderIcons = TBorderIcons() <<biSystemMenu <<biMinimize;
        Forma->Caption = "Aeaeia n " + Nick;
        Forma->Show();

        TMemo* ReceiveMemo = new TMemo(this);    // aeiaie?aneay memo
        ReceiveMemo->Parent = Forma;
        ReceiveMemo->Left = 1;
        ReceiveMemo->Top = 5;
        ReceiveMemo->Width = Forma->Width - 12;
        ReceiveMemo->Height = 200;
        ReceiveMemo->ScrollBars = ssVertical;
        ReceiveMemo->ReadOnly = true;

        TMemo* ReceiveMemo2 = new TMemo(this);    // aeiaie?aneay memo2
        ReceiveMemo2->Parent = Forma;
        ReceiveMemo2->Left = 1;
        ReceiveMemo2->Top = ReceiveMemo->Height + 30;
        ReceiveMemo2->Width = Forma->Width - 12;
        ReceiveMemo2->Height = 60;
        ReceiveMemo2->ScrollBars = ssVertical;
        ReceiveMemo2->Font->Size = 10;

        TButton* SendButton = new TButton(this);
        SendButton->Parent = Forma;
        SendButton->Left = Forma->Width - SendButton->Width - 15;
        SendButton->Top = Forma->Height - SendButton->Height - 45;
        SendButton->Caption = "Send";
     }
 };


Помогите плз. Как теперь правильно описать клас в хедере (File1.h)? Или дайте ссылку на пример.
Зарание спасибо.
PM MAIL ICQ   Вверх
Anikmar
Дата 27.4.2007, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Удобнее всего разнести объявление и реализацию.
Хедер:
Код


class PrivateForm {

 private:
    String Ip;
    String Nick;

 public:
    PrivateForm() {};
    PrivateForm(char _Ip[15], char _Nick[15]) ;
 };


Модуль:
Код

 #include "File1.h"
 #include "Unit1.h"

PrivateForm::PrivateForm(char _Ip[15], char _Nick[15]) {
        Ip.sprintf(_Ip);
        Nick.sprintf(_Nick);

        TForm* Forma = new TForm(Application, 1);
        Forma->Width = 320;
        Forma->Height = 365;
        Forma->Left = Form1->Left + Form1->Width/2 - (Forma->Width/2);
        Forma->Top = Form1->Top + Form1->Height/2 - (Forma->Height/2);
        Forma->BorderStyle = bsSingle;
        Forma->BorderIcons = TBorderIcons() <<biSystemMenu <<biMinimize;
        Forma->Caption = "Aeaeia n " + Nick;
        Forma->Show();

        TMemo* ReceiveMemo = new TMemo(this);    // aeiaie?aneay memo
        ReceiveMemo->Parent = Forma;
        ReceiveMemo->Left = 1;
        ReceiveMemo->Top = 5;
        ReceiveMemo->Width = Forma->Width - 12;
        ReceiveMemo->Height = 200;
        ReceiveMemo->ScrollBars = ssVertical;
        ReceiveMemo->ReadOnly = true;

        TMemo* ReceiveMemo2 = new TMemo(this);    // aeiaie?aneay memo2
        ReceiveMemo2->Parent = Forma;
        ReceiveMemo2->Left = 1;
        ReceiveMemo2->Top = ReceiveMemo->Height + 30;
        ReceiveMemo2->Width = Forma->Width - 12;
        ReceiveMemo2->Height = 60;
        ReceiveMemo2->ScrollBars = ssVertical;
        ReceiveMemo2->Font->Size = 10;

        TButton* SendButton = new TButton(this);
        SendButton->Parent = Forma;
        SendButton->Left = Forma->Width - SendButton->Width - 15;
        SendButton->Top = Forma->Height - SendButton->Height - 45;
        SendButton->Caption = "Send";
     }

PM MAIL ICQ   Вверх
Sergio
Дата 27.4.2007, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

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



Anikmar, я сделал как ты написал,  smile только при создании объекта этого класса "вылетает"  ошибка.
Не знаю что делать  

Присоединённый файл ( Кол-во скачиваний: 22 )
Присоединённый файл  error.JPG 18,44 Kb
PM MAIL ICQ   Вверх
Anikmar
Дата 27.4.2007, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Anikmar @  27.4.2007,  16:24 Найти цитируемый пост)
        TForm* Forma = new TForm(Application, 1);

Естественно вылетит. Вы форму объявляете внутри метода - она у вас локальная. После выхода из конструктора - стек  затирается и нету вашей формы.

Внесите ее объявление в поле класса
PM MAIL ICQ   Вверх
Sergio
Дата 27.4.2007, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

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



Мне в хедере инициализоровать? Вот так?:
Код

#include "Unit1.h"

class PrivateForm {

 private:
    String Ip;
    String Nick;
    TForm* Forma = new TForm(Application, 1);

 public:
    PrivateForm();
    PrivateForm(char _Ip[15], char _Nick[15]);
 };

PM MAIL ICQ   Вверх
Anikmar
Дата 27.4.2007, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Нет. Инициализация в объявлении класса запрещена. Инициализировать ее надо в методе, а объявлять в заголовке.

Грубо говоря, заголовок должен содержать только описательную часть класса. А конкретная работа с его полями должна  быть в методах. Просто учебные примеры обожают лепить все в объявление класса - тем самым запутывая. Маленькие функции можно размещать прямо в теле класса, но на практике - лучше выносить за пределы. Внести всегда можно, если она получилась в одну строчку.

В заголовке класса оставляете 
TForm* Forma;

А в методе уже размещаете строку 
Forma = new TForm(Application, 1);


Не забудьте удалить созданную форму в деструкторе класса либо автоматически из самой формы.
PM MAIL ICQ   Вверх
HappyLife
Дата 27.4.2007, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вообще-то форма не затерается ибо, она создается в куче.
Ошибка в другом. Вместо this, передавайте переменную формы.
А вообще советую все объявления переменных сделать в самом классе, а не в конструкторе.
PM MAIL   Вверх
Sergio
  Дата 27.4.2007, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

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



Народ сделал как Вы сказали:
хедер
Код

#include "Unit1.h"

class PrivateForm {

 private:
    String Ip;
    String Nick;
    TForm* Forma;

 public:
    PrivateForm();
    PrivateForm(char _Ip[15], char _Nick[15]);
 };

File.cpp
Код

#include "File1.h"
#include "Unit1.h"

PrivateForm::PrivateForm(char _Ip[15], char _Nick[15]) {
        Ip.sprintf(_Ip);
        Nick.sprintf(_Nick);

        Forma = new TForm(Application, 1);
        Forma->Width = 320;
        Forma->Height = 365;
        Forma->Left = Form1->Left + Form1->Width/2 - (Forma->Width/2);
        Forma->Top = Form1->Top + Form1->Height/2 - (Forma->Height/2);
        Forma->BorderStyle = bsSingle;
        Forma->BorderIcons = TBorderIcons() <<biSystemMenu <<biMinimize;
        Forma->Caption = "Aeaeia n " + Nick;
        Forma->Show();
     }

Ошибка:
[Linker Error] Unresolved external 'PrivateForm::PrivateForm()' referenced from D:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\MODULE\UNIT1.OBJ
PM MAIL ICQ   Вверх
Anikmar
Дата 27.4.2007, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(HappyLife @  27.4.2007,  17:31 Найти цитируемый пост)
Вообще-то форма не затерается ибо, она создается в куче.

Ага - я ступил. Затирается указатель, конечно. Но все равно неправильно  smile 
Цитата(Sergio @  27.4.2007,  17:41 Найти цитируемый пост)
Ошибка:
[Linker Error] Unresolved external 'PrivateForm::PrivateForm()' referenced from D:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\MODULE\UNIT1.OBJ 

Вы убрали определение функции из описания класса:
PrivateForm();
А раньше там же было пустое определение
PrivateForm() {  };

Так что в основном модуле создайте такой конструктор, либо выкиньте его вообще - все равно ничего не делает.
PM MAIL ICQ   Вверх
Sergio
  Дата 27.4.2007, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

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



Anikmar, сделал как ты написал:
File1.h
Код

#include "Unit1.h"

class PrivateForm {

 private:
    String Ip;
    String Nick;
    TForm *Forma;

 public:
    PrivateForm(char _Ip[15], char _Nick[15]);
 };

File1.cpp
Код

#include "File1.h"
#include "Unit1.h"

PrivateForm::PrivateForm(char _Ip[15], char _Nick[15]) {
        Ip.sprintf(_Ip);
        Nick.sprintf(_Nick);

        Forma = new TForm(Application, 1);
        Forma->Width = 320;
        Forma->Height = 365;
        Forma->Left = Form1->Left + Form1->Width/2 - (Forma->Width/2);
        Forma->Top = Form1->Top + Form1->Height/2 - (Forma->Height/2);
        Forma->BorderStyle = bsSingle;
        Forma->BorderIcons = TBorderIcons() <<biSystemMenu <<biMinimize;
        Forma->Caption = "Aeaeia n " + Nick;
        Forma->Show();
     }

И потом создаю объект:
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  PrivateForm *myform = new PrivateForm("Hello","World");
}

 smile Всё равно на стадии создании объекта "вылетает" ошибка:


Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  error.JPG 18,44 Kb
PM MAIL ICQ   Вверх
Anikmar
Дата 27.4.2007, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Во-первых я не уверен, что выбран правильный конструктор
Forma = new TForm(Application, 1); 

хотя могу и ошибаться, я не помню что такой вариант делает. 

Во-вторых, я бы на всякий случай переменную
PrivateForm *myform = new PrivateForm("Hello","World");
тоже бы вынес в поля класса - как-то неуютно видеть, как указатель на объект создается и сразу теряется так как он в стеке.

В третьих, под отладчиком проходили? На какой конкретно строке вылет?
PM MAIL ICQ   Вверх
Sergio
Дата 27.4.2007, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

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



Нашёл причину возникновения ошибки smile Это:
Код

 Ip.sprintf(_Ip);
   Nick.sprintf(_Nick);

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


Эксперт
****


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

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



А что эта функция делает? Неужто в текстовую константу что-то пишет?  smile 
PM MAIL ICQ   Вверх
Sergio
Дата 27.4.2007, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

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



Всем спасибо за помощь
PM MAIL ICQ   Вверх
stuper
Дата 20.5.2007, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Пожалуйста подскажите как мне правильно оформить объявление класса, его описание в Builder6, присоединить к проекту. Последствия моих усилий такие.
[C++ Error] MWord.cpp(5): E2111 Type 'MWord' may not be defined here
[C++ Error] MWord.cpp(5): E2136 Constructor cannot have a return type specification
h - файл компилируется без ошибок, cpp- выдает описанные ошибки.
Вот файл MWord.h:
Код

//#include <OleServer.hpp>
#include "Word_2K_SRVR.h"
class MWord
 {
   int N; //кол-во документов запущенных
   int Act; // индекс активного документа.
   TApplication *WinWord;
   TWordDocument *WordDoc;

   public:
    MWord();
   ~MWord();
 }

Вот файл MWord.cpp:
Код

#include <vcl.h>
#include "MWord.h"
//класс по работе с Word'oм
MWord::MWord()
{
  ShowMessage("Конструктор работает"); N=1;
}

MWord::~MWord()
{
   ShowMessage("деструктор работает");
}

Не обращайте внимания на относительную бессмысленность этого класса, т.к. я просто пытаюсь увидеть, что это работает. Он еще наполниться содержанием.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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