powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / посчитать количество объектов класса
34 сообщений из 34, показаны все 2 страниц
посчитать количество объектов класса
    #38081196
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет)
Возможно вопрос глупый, но я только учусь :).
У меня есть 2 класса: один класс - описание студента, другой класс описывает группу. Все прекрасно работает - посмотрите, пожалуйста, может что криво написано, и можно лучше :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
class Student
{
public:
	int age;
};

class StudentGroup
{
public:
	Student *students;
};


void main()
{
	Student st1;
	st1.age = 18;
	Student st2;
	st2.age = 21;

	StudentGroup p21v2;
	p21v2.students = new Student[2];
	p21v2.students[1] = st1;
	p21v2.students[2] = st2;
	cout<<p21v2.students[1].age<<"\n";
	cout<<p21v2.students[2].age<<"\n";
	system("pause");
}


Хочу добавить метод в класс, описывающий группу, что бы в любой момент времени можно было узнать, сколько человек в группе.
То есть там должен быть метод описанный, принимающий указатель на массив объектов Student, но я не знаю, как узнать когда (указатель+счетчик) указывает уже не на объект Student, а просто на какой-то кусок памяти.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class StudentGroup
{
public:
	Student *students;
	int countStudents(Student* stPointer)
	{
		int objCount;
                //вот какой тут цикл писать? :)
		return objCount;
	}
};
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38081202
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_Gя не знаю, как узнать когда (указатель+счетчик) указывает уже не на объект
Student, а просто на какой-то кусок памяти.
Заставь студента после рождения регистрировать себя в группе, а перед смертью -
разрегистрировать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38081207
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То, что ты написал, ООП не требует. Зачем у тебя классы и чему ты научился кроме оборачивания переменных словом class?

Так должно быть:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
class StudentGroup
{
private:
	Student *students;
	int count;

public:
	// конструктор
	// деструктор
	// добавление студента
	// удаление студента
};
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38081218
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо, действительно такой вариант возможен и достаточно просто реализуется. :)
Наверное мне стоило задать такой вопрос:
Если я динамически создаю массив, есть ли возможность узнать количество элементов в нем путем перебора через указатель со смещением?
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38081227
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_GЕсли я динамически создаю массив, есть ли возможность узнать количество
элементов в нем путем перебора через указатель со смещением?
Во-первых, нельзя.
Во-вторых, динамический массив в этой задаче напрочь не нужен: максимальное количество
студентов в группе ограничено достаточно малым числом.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38081247
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понял, спс.
Dimitry SibiryakovВо-вторых, динамический массив в этой задаче напрочь не нужен: максимальное количество
студентов в группе ограничено достаточно малым числом.

То есть Вы советуете не использовать динамические массивы там, где заранее возможно определить длинну массива и она с высокой вероятностью будет ограниченна достаточно малым числом?
Получается вместо указателя на массив объектов Student лучше создать статический массив длинной, например, 100?
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38081251
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_GПолучается вместо указателя на массив объектов Student лучше создать
статический массив длинной, например, 100?
Насколько я помню свою бытность в приёмной комиссии, максимум 50.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38081253
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_GЕсли я динамически создаю массив, есть ли возможность узнать количество элементов в нем путем перебора через указатель со смещением?
Было бы сущей глупостью каждый раз перебирать массив из произвольного(!) количества элементов. А если их миллиард? )) Потому логично хранить размер. Тем более, что обычно, кроме размера еще и разумно хранить количество используемых ячеек, а не перераспределять память при каждом добавлении/удалении данных.
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38081257
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.DragonMaximuS_GЕсли я динамически создаю массив, есть ли возможность узнать количество элементов в нем путем перебора через указатель со смещением?
Было бы сущей глупостью каждый раз перебирать массив из произвольного(!) количества элементов. А если их миллиард? )) Потому логично хранить размер. Тем более, что обычно, кроме размера еще и разумно хранить количество используемых ячеек, а не перераспределять память при каждом добавлении/удалении данных.
Спасибо! Но Вы именно указатель объявили - Student *students :)
Код: plaintext
1.
2.
3.
4.
class StudentGroup
{
private:
	Student *students;


Dimitry Sibiryakov
Ясно, спасибо!
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38081260
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну?

Выделю память на 50 студентов и запишу число 50 в count. В чем проблема?
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38081279
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну тогда Вы выделите память динамически :). А мы тут вроде решили, что динамически память выделять не надо для такого малого количества объектов :). Или Вы статический кусок выделите уже из вызывающей функции?
В любом случае, Вы делали другое замечание, так что все ОК. Спс)
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38081287
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_GВсем спасибо, действительно такой вариант возможен и достаточно просто реализуется. :)
Наверное мне стоило задать такой вопрос:
Если я динамически создаю массив, есть ли возможность узнать количество элементов в нем путем перебора через указатель со смещением?

Нет , такой возможности нет.
Надо хранить размер отдельно или использовать контейнеры, где этот размер уже хранится.
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38081289
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovMaximuS_GЕсли я динамически создаю массив, есть ли возможность узнать количество
элементов в нем путем перебора через указатель со смещением?
Во-первых, нельзя.
Во-вторых, динамический массив в этой задаче напрочь не нужен: максимальное количество
студентов в группе ограничено достаточно малым числом.


Это было очень спорное утверждение.
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38081291
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_GЯ понял, спс.
Dimitry SibiryakovВо-вторых, динамический массив в этой задаче напрочь не нужен: максимальное количество
студентов в группе ограничено достаточно малым числом.

То есть Вы советуете не использовать динамические массивы там, где заранее возможно определить длинну массива и она с высокой вероятностью будет ограниченна достаточно малым числом?
Получается вместо указателя на массив объектов Student лучше создать статический массив длинной, например, 100?

Это был абсолютно дурацкий совет.
Оставляй динамический массив, хотя бы для целей обучения.

Только сделай его правильно.

Кстати, если бы ты делал статический, размер заполненной части тебе все ровно надо было бы хранить.
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38081304
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivОставляй динамический массив, хотя бы для целей обучения.

Ради обучения - ещё туда-сюда, но городить динамику ради 200 байт?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38081307
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_GА мы тут вроде решили, что динамически память выделять не надо для такого малого количества объектов :)
Ну да, я касательно динамического выделения говорил. Препод на статику посмотрит и скажет "Так и дурак может - переделывай!" ))
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38081313
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovMasterZivОставляй динамический массив, хотя бы для целей обучения.

Ради обучения - ещё туда-сюда, но городить динамику ради 200 байт?..
Ради 200 байт (т.е. 50-ти int-возрастов) и классы городить не надо ))
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38081315
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.DragonПрепод на статику посмотрит и скажет
Но можно ведь и уточнить у него - есть ли по этому поводу какие пожелания или делай как хочешь.
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38081347
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivMaximuS_GЯ понял, спс.
пропущено...

То есть Вы советуете не использовать динамические массивы там, где заранее возможно определить длинну массива и она с высокой вероятностью будет ограниченна достаточно малым числом?
Получается вместо указателя на массив объектов Student лучше создать статический массив длинной, например, 100?

Это был абсолютно дурацкий совет.
Оставляй динамический массив, хотя бы для целей обучения.

Только сделай его правильно.

Кстати, если бы ты делал статический, размер заполненной части тебе все ровно надо было бы хранить.
Ок, понял, спасибо большое! :)
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38081538
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovMasterZivОставляй динамический массив, хотя бы для целей обучения.

Ради обучения - ещё туда-сюда, но городить динамику ради 200 байт?..


Видеш ли, постановки задачи нет ни у тебя, ни у меня. По умолчанию должно быть так: фиксированное количество объектов — обычный массив, переменное — динамический.
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38082693
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivТолько сделай его правильно.
Есть вот такой вариант реализации - покритикуйте, пожалуйста :). Правильно ли реализован метод addStudent?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
class student
{
	
	public:

	char name[SIZE];
	int age;

	student(char n[SIZE]="", int a=16)
	{
	strcpy(name, n);
	age = a;
	}

	~student(){}

	void print()
	{
	cout<< name<<age<<'\n';
	}
};

class group
{
	int groupID;
	int startYear;
	int students;
	student *Pst;

public:
	group(int c, int y)
	{
	groupID = c;
	startYear = y;
	students = 0;
	}

	~group()
	{
		delete []Pst;
	}

	void printGroup()
	{
	cout<<"ID "<<groupID<<", start "<<startYear<<'\n';
	for (int i=0; i<students; i++)
			Pst[i].print();
		cout<<students<<" students \n";	
	}

	void addStudent(char Name[SIZE], int year)
	{
	
	student *Ptemp = Pst;
	Pst = new student[students+1];

	for (int i=0; i<students; i++)
		Pst[i] = Ptemp[i];
	
	strcpy(Pst[students].name, Name);
	Pst[students].age = year;

	if (students>0) delete [students]Ptemp; // здесь вылетает 

	students ++;

	
	}
};

int main()
{

	group g1(01, 2012);
	g1.printGroup();

	g1.addStudent("Petya Pupkin", 25);
	g1.printGroup();

	g1.addStudent("Katya Pupkin", 24);
	g1.printGroup();

	g1.addStudent("Kat3 Pipkin", 23);
	g1.printGroup();

	//system("pause");
	return 0;
}


Заранее спасибо!
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38082779
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Критикую. Неправильно.
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38082781
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
Pst = new student[students+1];


Тут как-бы надо ломать голову чтоб понять а что ты хотел сделать.
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38082799
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Код: plaintext
1.
Pst = new student[students+1];


Тут как-бы надо ломать голову чтоб понять а что ты хотел сделать.
Спасибо за критику :). А как бы Вы посоветовали реализовать метод addstudent ?
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38082807
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зависит от того что будешь делать с группами в будущем. Можно использовать ptr_vector<T>
чтобы извлекать всех студентов из группы. А можно и просто завести счетчик который будет
их считать.
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38082810
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно и просто завести счетчик который будет их считать.
Так счетчик и так есть - int students;
А про ptr_vector<T> я не знаю пока, сейчас почитаю :)
Спасибо.
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38082812
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заодно и про string почитайте
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38082819
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
string пока не учили :). Я сам пока его решил не разбирать
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38083099
Обиженный Нацист
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovMasterZivОставляй динамический массив, хотя бы для целей обучения.

Ради обучения - ещё туда-сюда, но городить динамику ради 200 байт?..


А вы не подозреваете что может быть не одна группа, а 100 ?
Что может быть не просто группа студентов конкретного курса, но и группа студентов по интересам.
Думаю нужно начинать уже сейчас в правильное русло товарища направить. А не тяпляп пока так сойдет, раз уж речь идет об ООП.
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38083672
vaddddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonКритикую. Неправильно.

Можно поконкретнее?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
	void addStudent(char Name[SIZE], int year)
	{
	
	student *Ptemp = Pst;     //     временный указатель на старый массив
	Pst = new student[students+1];  // создаем новый массив размером +1

	for (int i=0; i<students; i++)       //   копируем все из старого в новый
		Pst[i] = Ptemp[i];
	
	strcpy(Pst[students].name, Name); // добавляем нвые данные в массив
	Pst[students].age = year;

	if (students>0) delete [students]Ptemp; // удаляем старый массив

	students ++;  счетчик +1

	
	}
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38084246
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
up :)
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38084424
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_G, а что спросить хотел?
Твой вариант компилируется и работает. Только:
Код: plaintext
1.
2.
3.
4.
      заменил      
      if (students>0) delete [students]Ptemp;
      на 
      if (students>0) delete [] Ptemp;


можно и так написать

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
#include <iostream>
#include <vector>
#include <string>

using namespace std;

class Student
{
private:
        int age;
        string name;

public:
        Student(int _age, string _name):age(_age), name(_name)
            {}

        void print_age()
            { cout<<"Name: "<<name<<" Age: "<<age<<endl;}
};

class StudentGroup
{
private:
        vector<Student *> *students;
public:
        StudentGroup()
        {
            //cout<<"new vector<Student *>"<<endl;
            students=new vector<Student *>;
        }

        ~StudentGroup()
        {
            int imax=students->size();
            for(int i=0;i<imax;i++)
            {
                //cout<<"delete: "<<i<<endl;
                delete students->at(i);
            }

            //cout<<"delete vector<Student *> "<<endl;
            delete students;
        }

        void add_student(int age, string name="")
        {
            students->push_back(new Student(age, name));
        }

        void print_students()
        {
            int imax=students->size();
            cout<<"Amount of students: "<<imax<<endl;
            for(int i=0;i<imax;i++)
            {
                cout<<i+1<<" - ";
                students->at(i)->print_age();
            }
        }
};

int main()
{
	StudentGroup *p21v2=new StudentGroup();
	p21v2->add_student(18);
	p21v2->add_student(19,"Kolya");
	p21v2->add_student(22,"Sereja");

	p21v2->print_students();
	cout<<endl;

    delete p21v2;
	return 0;
}


...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38084894
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vaddddd, хм... да. Вобщем-тот сойдет. Ну если если такой синтаксис delete[..] прокатывает
и память не утекает. То вобщем-то нормально.
...
Рейтинг: 0 / 0
посчитать количество объектов класса
    #38086122
Vadddddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,
вроде delete [n] p и delete [] p - одно и тоже.

m_Sla ,

спасибо, так конечно намного красивее,
мы только вектор еще не учили.
...
Рейтинг: 0 / 0
34 сообщений из 34, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / посчитать количество объектов класса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]