class THistory
{
private:
public:
TLabel *lblDate;
TEdit *edtDate;
__fastcall THistory(Classes::TComponent* AOwner);
__fastcall ~THistory();
};
__fastcall THistory::THistory(Classes::TComponent* AOwner)
{
lblDate = new TLabel(AOwner);
edtDate = new TEdit(AOwner);
}
__fastcall THistory::~THistory()
{
delete lblDate;
delete edtDate;
}
Динамическое размещение контроллов на форме.
Код:
Если размещать один такой набор, то все просто:
Код:
THistory *history = new THistory(frmForm);
history->lblDate->Parent = frmForm;
history->lblDate->Caption = "Дата";
history->lblDate->Left = 8;
history->lblDate->Top = 200;
history->edtDate->Parent = frmForm;
history->edtDate->Text = "01/01/01";
history->edtDate->Left = 76;
history->edtDate->Top = 210;
history->edtDate->ReadOnly = true;
delete history;
history->lblDate->Parent = frmForm;
history->lblDate->Caption = "Дата";
history->lblDate->Left = 8;
history->lblDate->Top = 200;
history->edtDate->Parent = frmForm;
history->edtDate->Text = "01/01/01";
history->edtDate->Left = 76;
history->edtDate->Top = 210;
history->edtDate->ReadOnly = true;
delete history;
Вопрос в том, как разместить неограниченное их количество. Думаю сделать это с помощью контейнера vector. Помогите советом как это сделать.
В классе формы:
Код:
typedef std::vector<THistory*> THistory_vector;
THistory_vector vec_history;
THistory_vector vec_history;
Код:
THistory *history = new THistory(frmForm);
history->lblDate->Parent = frmForm;
history->lblDate->Caption = "Дата";
history->lblDate->Left = 8;
history->lblDate->Top = 200;
history->edtDate->Parent = frmForm;
history->edtDate->Text = "01/01/01";
history->edtDate->Left = 76;
history->edtDate->Top = 210;
history->edtDate->ReadOnly = true;
vec_history.push_back(history);
delete history;
history->lblDate->Parent = frmForm;
history->lblDate->Caption = "Дата";
history->lblDate->Left = 8;
history->lblDate->Top = 200;
history->edtDate->Parent = frmForm;
history->edtDate->Text = "01/01/01";
history->edtDate->Left = 76;
history->edtDate->Top = 210;
history->edtDate->ReadOnly = true;
vec_history.push_back(history);
delete history;
history->lblDate->Parent = frmForm;
history->lblDate->Caption = "Дата";
history->lblDate->Left = 8;
...
Но вот дальше работать через vec_history[0] не получится потому как в вектор скопирован не сам экземпляр класса THistory, а ссылка на него. Оператором delete history; это дело уничтожается. Вопрос: как скопировать экзепляр history в вектор?
Используя копирующий конструктор. Или создав свой шаблон vector. Или используя auto_ptr.
Цитата:
Originally posted by kot_
Используя копирующий конструктор. Или создав свой шаблон vector. Или используя auto_ptr.
Используя копирующий конструктор. Или создав свой шаблон vector. Или используя auto_ptr.
В строке vec_history.push_back(history); никаких конструкторов не вызывается. Хотя если написать THistory his = *history; вызавется конструктор копирования. Как заставить скопировать класс в вектор?
Цитата:
Originally posted by Nick_M
В строке vec_history.push_back(history); никаких конструкторов не вызывается. Хотя если написать THistory his = *history; вызавется конструктор копирования. Как заставить скопировать класс в вектор?
В строке vec_history.push_back(history); никаких конструкторов не вызывается. Хотя если написать THistory his = *history; вызавется конструктор копирования. Как заставить скопировать класс в вектор?
А если так -
Код:
vec_history.push_back(new THistory(*history));
- хотя у данного варианта есть свои недостатки - правда сейчас не помню какие именно. Попробуй использовать что либо подобное.
Когда мне необходимо было помещать объект своего класса в контейнер - я просто наследовал, в моем случае от нужного мне - и писал свою функцию размещения. Двойное удовольствие - во первых сам контролируешь помещение и удаление объекта, во вторых большинство стандартных функций шаблона и вся мощь стл к твоим услугам.:)