@EVOSandru6

Как правильно создать массив объектов текущего класса в методе данного класса?

Привет!

Ставится задача создания метода, который формирует массив объектов. Правильно ли делать этот метод внутри класса, экземпляром которого должны быть эти элементы массива?

Есть класс (инициализация):

class Department{

	private:

		// код цеха
		int code;

		// имя цеха
		UnicodeString name;

		// нижние 2 наверное нафиг
		TADOQuery * query;

		// кол-во записей в таблице
		int rowsCount;

		// DataSource
		TDataSource * source;

		// Лукап комбобокс
		TDBLookupComboBox * lookup;

		// заголовок
		TLabel * label;

	public:

		// геттер
		UnicodeString getName();

		// сеттер кол-ва записей отделов
		void setRowsCount();

		// геттер числа строк
		int getRowsCount();

		// получить все отделы
		Department * getAll();

		// получить единственный элемент
		void Department::getItem();

		// получить массив отделов с помощью стека
		void Department::getAllStack();

		// получить свойства для данного отдела
		void Department::getProperties();

		Department();
};


Определение:

// Конструктор первого создания
Department::Department(){
	this->setRowsCount();
}

UnicodeString Department::getName(){
	return this->name;
}

// кол-во записей отделов
void Department::setRowsCount(){
	TADOQuery * sql = new TADOQuery(DataModule1);
	sql->Connection = DataModule1->DB;
	sql->SQL->Text = "SELECT COUNT(*) AS count FROM t_division WHERE LEVEL = 3";
        sql->Open();
	int count = sql->FieldByName("count")->AsInteger;
	this->rowsCount = count;
}

// кол-во записей отделов
int Department::getRowsCount(){
    return this->rowsCount;
}

// перебираем все отделы
Department * Department::getAll(){

	Department * depArray = new Department [this->rowsCount];
	DataModule1->departmentTab->First();
	int c = 0;

	while(!DataModule1->departmentTab->Eof){

		Department * depModel = new Department();
		depModel->code = DataModule1->departmentTab->FieldByName("CODE")->AsInteger;
		depModel->name = DataModule1->departmentTab->FieldByName("NAME")->AsAnsiString;
		depArray[c] =  * depModel;
		DataModule1->departmentTab->Next();
		c++;
	}
	return depArray;
}


Очень интересует вот это место:

while(!DataModule1->departmentTab->Eof){

		<b>Department * depModel = new Department();
		depModel->code = DataModule1->departmentTab->FieldByName("CODE")->AsInteger;
		depModel->name = DataModule1->departmentTab->FieldByName("NAME")->AsAnsiString;
		depArray[c] =  * depModel;
		DataModule1->departmentTab->Next();
		c++;</b>
}


Создание такого массива объектов класса текущего класса вводит в заблуждение. При этом конструктор отрабатывается уйму раз. Но данный метод getRowsCount, лежит для того, чтобы не вызывать его каждый раз при создании объекта, ведь мне нужен count для цикла for, чтобы этот массив перебирать.

Типа того:

Department * department = new Department();
	Department * depArray  =   department->getAll();
	for(int i = 0; i < department->getRowsCount(); i++){
		 testArrayMemo->Lines->Add(depArray[i].getName());
	}


В каком месте правильнее этот массив собирать? В общем оно даже работало и собиралось, пока я не определил конструктор.

Как правильно организовать данную вещь. На с++ раньше не кодил. Вижу что тут что-то не так. Что приходит на ум - наследование либо второй конструктор без параметров. Посоветуйте как правильно?
  • Вопрос задан
  • 611 просмотров
Решения вопроса 1
Adamos
@Adamos
Просто задайте в конструкторе rowsCount = -1
А в getRowsCount первой строчкой
if(rowsCount == -1) setRowsCount();
Ну, и getAll я бы сделал static с аргументом rowsCount - это же фабрика таких объектов, а не метод, работающий с конкретным экземпляром класса.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
26 июн. 2024, в 02:23
5000 руб./за проект
26 июн. 2024, в 00:28
5000 руб./за проект
25 июн. 2024, в 23:31
1500 руб./за проект