C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

  ЗакрытаНовая темаНовый опрос
Области видимости публичных членов..., Как правильно объявить?
** Harold
Отправлено: 06.12.2005, 15:35


Не зарегистрирован







"Детский" вопрос -
Имеем в модуле Формы:
[CODE]
#include "MyClass.h"
...
TMyClass *MyClass = new TMyClass;
MyClass->m_iMyVar; //все публичное видно и работает
...
delete MyClass;

Как из другого своего класса обратиться к той же переменной MyClass->m_iMyVar?
Те, надо как-то передать указатель на уже созданный экземпляр класса MyClass.
Например, в модуле другого класса
#include "MyClass.h"
...
TMyClass *MyClass; — получается указатель на неизвесто что... sad.gif
....
Новый экз. класса — новая m_iMyVar.... — sad.gif

Как правильно, подскажите, pls. В поиске смотрел — не нашел, наверное, что-то слишком простое...
** exp
Отправлено: 06.12.2005, 15:48


Не зарегистрирован







Уточните вопрос. Непонятно, что надо сделать.
** Harold
Отправлено: 06.12.2005, 15:58


Не зарегистрирован







Надо из класса TMySecondClass прочитать значение публичной переменной класса TMyClass...
Какие объявления надо для этого сделать?
Guest
Отправлено: 06.12.2005, 16:59


Не зарегистрирован







Публичный или передать в класс 2 указатель на экземпляр класса 1.
** Harold
Отправлено: 06.12.2005, 17:11


Не зарегистрирован







Надо прочитать значение public-переменной класса1 из функции объявленной в классе2.
** Harold
Отправлено: 07.12.2005, 22:46


Не зарегистрирован







Неужели никто никогда не сталкивался c чтением из кода одного класса public-переменных другого класса ? sad.gif
Gedeon
Отправлено: 08.12.2005, 08:52


Ветеран

Группа: Модератор
Сообщений: 1742



Да просто понять никто не может что надо то, или что не получается у Вас.

При такой постановке вопроса
CODE

TMyClass *MyClass = new TMyClass;
MyClass->m_iMyVar; //все публичное видно и работает
...
delete MyClass;

Он же будет только это время и существовать, чтобы его было видно в другом юнить, обьявите указатель в н-файле, и создавайте себе на здоровье в юните, удаляйте, когда не нужен и обращаеться можно к нему из любого места, где включен хидер.
Если функция Вашего класса должна уметь работать с разными экземплярами этого класса, то и передавайте указатель на обьект нужного в нее, все ж я не пойму в чем проблема то?
** Harold
Отправлено: 09.12.2005, 02:45


Не зарегистрирован







Гедеон, я — дятел — и знаю только один способ дать всем "пацанам" знать, что есть такой новый КЛАСС через *.h файл ( читаю литературу, автор Арх-ский)

Объявляю, что

(типа, *h-файл — трехканального ПИД-регулятра)


CODE


#ifndef PidH
#define PidH

#include <StdCtrls.hpp>

//---------------------------------------------------------------------------
class TPid
{
private: // User declarations
public: // User declarations

TPid (); //конструктор
//~TPid ();//пока что не нужен....

int __fastcall CalculateOutputValue (char cChannelNumber, float fNeededTemper);

float m_fGain[3];
float m_fTd[3];
float m_fTi[3];
float m_fCoefExpFilter[3];

float m_fErrorTempJump;
int   m_iErrorTempCount;
float m_fHalfPowerTemper;

float m_fInputTemperTask[3];
int   m_iOutputControllerTaskValue[3];
int   m_iPreviousOutputControllerTaskValue[3];
};
//---------------------------------------------------------------------------
#endif



Ну, в конструкторе, там через ини-файл все что нужно передается (славабогу, (ну, атеист я)) ФОРМА (кстати, почему-то) в любом модуле видна...

ГДЕ В ЭТОМ Pid.h мне сделать объявление, чтобы мой класс TPid был виден в ЛЮБОМ месте моей проги ??? (за переменными услежу, не боИсь — просто я ХОРОШО понимаю, что делаю). Просто дЯтел я в С++ и поэтому все эти закорючки, классы и т.п. — ДОСТАЛИ... — радует одно — легко в BCB нарисовать красивый интерфейс...)

Подскажи, pls!

ЗЫ: Если я выражаюсь непонятно, то могу положить (ну.. найду куда) "смешной" проектик из пары "классиков" (чтобы время твое не тратить попусту).... А ты ткнешь мне, неразумному, где у меня ошибка? Если не "в лом", конечно...
А то чего-то кризис у меня... Дай хоть до осознания необходимости "protected" и "private" дорасти... smile.gif
gvg
Отправлено: 09.12.2005, 09:22


Машинист паровоза

Группа: Участник
Сообщений: 222



QUOTE (** Harold @ 09/12/2005, 02:45)
ГДЕ В ЭТОМ Pid.h мне сделать объявление, чтобы мой класс TPid был виден в ЛЮБОМ месте моей проги ???

Включить pid.h в cpp, использующие этот класс. Причем класс, а не его экземпляр. Но, полагаю, нужно, чтобы другой класс мог обращаться к членам этого самого TPid? Тогда, если предполагается использовать только один его экземпляр, объявить его через extern (как у форм). Иначе передавать ссылку на экземпляр TPid в использующий его класс.
Guest
Отправлено: 09.12.2005, 09:58


Не зарегистрирован







QUOTE

ГДЕ В ЭТОМ Pid.h мне сделать объявление, чтобы мой класс TPid был виден в ЛЮБОМ месте моей проги ???

CODE

class TPid
{
...
};
//---------------------------------------------------------------------------
TPid* gblPid;
#endif

Где то создать один раз gblPid = new TPid везде использовать gblPid->...
Gedeon
Отправлено: 09.12.2005, 12:39


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (** Harold @ 09/12/2005, 02:45)
(ну.. найду куда) "смешной" проектик из пары "классиков" (чтобы время твое не тратить попусту).... А ты ткнешь мне, неразумному, где у меня ошибка? Если не "в лом", конечно...

Если зарегистрироваться на формуе, то можно прямо сюда.
m_sHarold
Отправлено: 11.12.2005, 19:57


Ученик-кочегар

Группа: Участник
Сообщений: 7



Положил проектик сюда

Глянь, пожалуйста, где собака порылась...

Если, вдруг, кому тоже не лениво посоветуйте....
m_sHarold
Отправлено: 13.12.2005, 00:31


Ученик-кочегар

Группа: Участник
Сообщений: 7



Вроде, многие смотрят этот thread, а никто так и не взял смелость -
1. Послать... (в литературу, ест-но wink.gif, мы ж культурные люди... )
2. Сказать, ну хотя бы, что "затрахался сам — не парь других..."(вариации приветствуются).
3. Изречь, что "Трафик ДЕНЕг СТОИТ..." (серьёзно так wink.gif ).
4. Скачать и глянуть в пол-глаза (Лениво. Понимаю. Так и скажите. Сам такой... wink.gif )

Всем удачи в делах,
Harold.

P.S. Если "достал", то просто "снесите" в трёп, ну, или
гляньте, pls, по ссылке одним сообщением выше — 3 кнопки и 2 лейбла займут совсем немного времени (с пояснениями в hint'ах и комментариях...)

Asher
Отправлено: 13.12.2005, 09:47


Мастер участка

Группа: Модератор
Сообщений: 550



Здравствуйте.
Не надо пожалуйста горячится. Просто очень мало людей ходит сюда в выходные,а понедельник — это разговор особый. cool.gif
Теперь по Вашей, кхм.... проблеме.

TClass1 должен манипулировать TClass2 в методе ChangeLabel2_Caption.
Изменяем эту функцию на следующую
CODE
void __fastcall TClass1::ChangeLabel2_Caption (TClass2 *e_pPtr)
{
if(NULL == e_pPtr) //Если указатель не передали, то
return; //Выйти
if(true == e_pPtr->m_bFlag){ //
Form1 ->Label2->Caption = e_pPtr->m_asCaption2;//
e_pPtr->m_bFlag = false; //
Form1 ->Button3->Enabled = false;//
}

соответственно исправляем её описание в хедере и переносим #include "Unit2.h" из cpp в h
Ну и теперь исправляем вызов
CODE
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Class1->ChangeLabel2_Caption(Class2);//Передаем указатель на объект
}


P.S. #include "Unit1.h" в Unit2.cpp НЕ НУЖЕН!
P.P.S. Почему таймер должен идти заново я не понял, наверное там должно быть обнуление m_iTimerCount
P.P.P.S. Для многопоточной реализации нужны будут критические секции.

Отредактировано Asher — 13/12/2005, 10:49
m_sHarold
Отправлено: 13.12.2005, 12:54


Ученик-кочегар

Группа: Участник
Сообщений: 7



Спасибо за доступные разъяснения, Asher.
Наверное, прочитатнная мной книжка (или мозги, что вернее) имела склеенные страницы ... (может, в понедельник читал cool.gif ) в главе Указатели.

Надеюсь, что тема закрыта... wink.gif

Всем удачи,
Harold.

Вернуться в Вопросы программирования в C++Builder
ЗакрытаНовая темаНовый опрос