** 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; — получается указатель на неизвесто что...
....
Новый экз. класса — новая m_iMyVar.... —
Как правильно, подскажите, 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-переменных другого класса ? |
|
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" дорасти... |
|
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. Послать... (в литературу, ест-но , мы ж культурные люди... )
2. Сказать, ну хотя бы, что "затрахался сам — не парь других..."(вариации приветствуются).
3. Изречь, что "Трафик ДЕНЕг СТОИТ..." (серьёзно так ).
4. Скачать и глянуть в пол-глаза (Лениво. Понимаю. Так и скажите. Сам такой... )
Всем удачи в делах,
Harold.
P.S. Если "достал", то просто "снесите" в трёп, ну, или
гляньте, pls, по ссылке одним сообщением выше — 3 кнопки и 2 лейбла займут совсем немного времени (с пояснениями в hint'ах и комментариях...)
|
|
Asher |
Отправлено: 13.12.2005, 09:47 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
Здравствуйте.
Не надо пожалуйста горячится. Просто очень мало людей ходит сюда в выходные,а понедельник — это разговор особый.
Теперь по Вашей, кхм.... проблеме.
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.
Наверное, прочитатнная мной книжка (или мозги, что вернее) имела склеенные страницы ... (может, в понедельник читал ) в главе Указатели.
Надеюсь, что тема закрыта...
Всем удачи,
Harold. |
|