Ant |
Отправлено: 01.09.2004, 11:07 |
|
Не зарегистрирован
|
Я хочу создать класс типа:
Tables->Table[index]->AddValue();
Меня интересует как сделать так чтобы класс Tables содержал класс Table и чтобы допустим при вызове
Tables->Add(name) создавался новый класс Table и потом к ниму можно было обрашатся Tables->Table[index]->Name |
|
xTrim |
Отправлено: 01.09.2004, 11:31 |
|
Машинист паровоза
Группа: Участник
Сообщений: 208
|
примерно так
CODE |
#include <vector>
class Tables
{
private:
std::vector<TTable*> tbls_;
public:
TTable* Add(AnsiString name)
{
TTable* t = new TTable(NULL);
t->TableName = name;
tbls_.push_back(t);
return t;
}
TTable* operator[](int i)
{
return tbls_[i];
}
};
|
|
|
Ant |
Отправлено: 01.09.2004, 11:40 |
|
Не зарегистрирован
|
Большое спасибо!!!!
Я был бы еще в двойне блогадарен если бы расказали что здесь икак
что такое
std::vector tbls_;
и
TTable* operator[](int i)
|
|
Konstantine |
Отправлено: 01.09.2004, 11:54 |
|
Мастер участка
Группа: Модератор
Сообщений: 545
|
Лучше почитай сначала литературу про ООП и классы, т.к. двумя словами тут не разберёшся.
|
|
xTrim |
Отправлено: 01.09.2004, 12:06 |
|
Машинист паровоза
Группа: Участник
Сообщений: 208
|
vector — динамический массив
operator[] — оператор [], возвращающий указатель на TTable
дальше — курить Срауструпа
|
|
Guest |
Отправлено: 01.09.2004, 12:24 |
|
Не зарегистрирован
|
с вектором и оператором все понятно.
а что такое std::vector tbls_ ?
поток таблиц ????
|
|
Guest |
Отправлено: 01.09.2004, 12:25 |
|
Не зарегистрирован
|
Сенкс |
|
xTrim |
Отправлено: 01.09.2004, 12:52 |
|
Машинист паровоза
Группа: Участник
Сообщений: 208
|
CODE | std::vector<TTable*> tbls_; | — динамический массив указателей на TTable именуемый tbls_
|
|
Guest |
Отправлено: 01.09.2004, 13:58 |
|
Не зарегистрирован
|
QUOTE (xTrim @ 01/09/2004, 13:54) | динамический массив указателей на TTable именуемый tbls_ |
это скорее всего vector tbls_.
а что такое std:: ? |
|
xTrim |
Отправлено: 01.09.2004, 14:21 |
|
Машинист паровоза
Группа: Участник
Сообщений: 208
|
std:: — пространство имен (в простонародии namespace) стандартной библиотеки, в котором находятся различные классы и функции в т.ч. и vector.
у Страуструпа конечно это все немного подробнее описано
|
|
ant |
Отправлено: 02.09.2004, 07:55 |
|
Не зарегистрирован
|
Чтото у меня не получается вот мой код может чтото подскажете:
CODE | #include <vector>
//---------------------------------------------------------------------------
class TDataTable{
__property AnsiString Name = {write=SetName, read=GetName};
private:
void SetName(AnsiString);
AnsiString GetName();
AnsiString NameTable;
};
class TDataTables{
public:
TDataTables();
TDataTable* Add(AnsiString name)
{
TDataTable* t = new TDataTable();
t->Name = name;
tbls_.push_back(t);
return t;
}
TDataTable* operator[](int i)
{
return tbls_[i];
}
private:
std::vector<TDataTable*> tbls_;
};
|
А вот и само создание и вызов процедур класса:
CODE |
TDataTables *g=new TDataTables;
g->Add("Ура!");
ShowMessage(g[0]->Name); // Не работает пошет что E2288 Pointer to structure required on left side of -> or ->*
|
А когда пишу g->operator[](0)->Name — Работает |
|
xTrim |
Отправлено: 02.09.2004, 09:09 |
|
Машинист паровоза
Группа: Участник
Сообщений: 208
|
CODE |
ShowMessage((*g)[0]->Name);
//либо
TDataTables &g1 = (*g);
ShowMessage(g1[0]->Name);
|
|
|
joynter |
Отправлено: 02.09.2004, 09:31 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 137
|
а у меня ругается еще и на t->Name
E2247 'TDataTable::Name' is not accessible |
|
xTrim |
Отправлено: 02.09.2004, 09:36 |
|
Машинист паровоза
Группа: Участник
Сообщений: 208
|
правильно, Name же в private сидит
CODE |
class TDataTable{
__property AnsiString Name = {write=SetName, read=GetName};
|
|
|
joynter |
Отправлено: 02.09.2004, 10:06 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 137
|
правильно ли я вас понял?
class TDataTable
{
public:
__property AnsiString Name = {write=SetName, read=GetName};
private:
void SetName(AnsiString name)
{
Name = name;
}
AnsiString GetName()
{
return Name;
}
AnsiString NameTable;
};
Отредактировано joynter — 02/09/2004, 11:08 |
|
Konstantine |
Отправлено: 02.09.2004, 10:49 |
|
Мастер участка
Группа: Модератор
Сообщений: 545
|
да, но можно даже:
CODE | __property AnsiString Name = {write=SetName, read=Name};
|
где Name — строка.
В этом случае не нада GetName.
|
|
joynter |
Отправлено: 02.09.2004, 10:55 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 137
|
вызываяCODE | ShowMessage((*g)[0]->Name);
//либо
TDataTables &g1 = (*g);
ShowMessage(g1[0]->Name); |
комп говорит Sack Overflow.
объясните пожалуйста, почему?
Отредактировано joynter — 02/09/2004, 11:58 |
|
xTrim |
Отправлено: 02.09.2004, 11:08 |
|
Машинист паровоза
Группа: Участник
Сообщений: 208
|
все правильно
CODE |
__property AnsiString Name = {write=SetName, read=GetName};
private:
void SetName(AnsiString name)
{
Name = name;
// куда присваиваем? снова себе
}
AnsiString GetName()
{
return Name;
// что тут возвращать будет?
// имхо будет обращение к первой строке
}
т.е. надо
__property AnsiString Name = {write=SetName, read=GetName};
private:
AnsiString FName;
void SetName(AnsiString name)
{
FName = name;
}
AnsiString GetName()
{
return FName;
}
//
__property AnsiString Name = {write=SetName, read=Name};
тоже самое, надо
__property AnsiString Name = {write=SetName, read=FName};
|
|
|
joynter |
Отправлено: 02.09.2004, 11:18 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 137
|
спасибо |
|
Ant |
Отправлено: 02.09.2004, 13:12 |
|
Не зарегистрирован
|
А нельзя сделать как в TFields?
Добавления Field:
Fields->Add(Field)
А просмотр:
Fields->Fields[0]->Name |
|