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

 
Помогите разобраться с классами, Классы
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
дальше — курить Срауструпа cool.gif
Guest
Отправлено: 01.09.2004, 12:24


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







с вектором и оператором все понятно.
а что такое std::vector tbls_ ?
поток таблиц ????
Guest
Отправлено: 01.09.2004, 12:25


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







Сенкс biggrin.gif
xTrim
Отправлено: 01.09.2004, 12:52


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

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



CODE
std::vector<TTable*> tbls_;
 — динамический массив указателей на TTable именуемый tbls_ biggrin.gif biggrin.gif biggrin.gif
Guest
Отправлено: 01.09.2004, 13:58


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







QUOTE (xTrim @ 01/09/2004, 13:54)
динамический массив указателей на TTable именуемый tbls_ biggrin.gif biggrin.gif biggrin.gif

это скорее всего vector tbls_.
а что такое std:: ?
xTrim
Отправлено: 01.09.2004, 14:21


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

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



std:: — пространство имен (в простонародии namespace) стандартной библиотеки, в котором находятся различные классы и функции в т.ч. и vector.
у Страуструпа конечно это все немного подробнее описано wink.gif
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



все правильно smile.gif
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

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