Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Господа, помогите на простом примере понять как это реализуется (С++) / 25 сообщений из 29, страница 1 из 2
28.06.2006, 15:16
    #33819483
Господа, помогите на простом примере понять как это реализуется (С++)
вот допустим такой класс:
Код: plaintext
1.
2.
3.
4.
5.
class cl
{
   int a;
   int b;
};
как например написать статическую функцию вывода всех созданных объектов класса?

как будет выглядеть программа? искал что-то подобное и не нашел. если можно напишите пожалуйста реализацию этого вопроса, я по ней разберусь с работой статических функций. к своему великому стыду никогда ими не пользовался.
заранее спасибо!
...
Рейтинг: 0 / 0
28.06.2006, 15:30
    #33819556
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Господа, помогите на простом примере понять как это реализуется (С++)
Не приходит ничего в голову, кроме, как создавать, к примеру, статический динамический массив, куда будут складываться, все указатели классов при инициализации, а статическая функция будет этот массив распечатывать.
...
Рейтинг: 0 / 0
28.06.2006, 15:37
    #33819590
Господа, помогите на простом примере понять как это реализуется (С++)
а если можно, все таки примерчик приведите
...
Рейтинг: 0 / 0
28.06.2006, 15:45
    #33819622
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Господа, помогите на простом примере понять как это реализуется (С++)
Не уверен, что это правельный/оптимальный вариант...
...
Рейтинг: 0 / 0
28.06.2006, 15:55
    #33819662
Господа, помогите на простом примере понять как это реализуется (С++)
если честно не думал что это такой сложный вопрос, на который даже спецы не могут ответить...
и все же, если кто знает КАК, напишите пожалуйста пример!
...
Рейтинг: 0 / 0
28.06.2006, 16:09
    #33819712
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Господа, помогите на простом примере понять как это реализуется (С++)
Код: 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 A;
class A {
    public:
        A(int n);
	int a;

        static A **p;
	static int p_n;
	static void print();
};

A **A::p=NULL;
int A::p_n= 0 ;

A::A(int n) {
    a=n;

    if (p==NULL) p=(A**)malloc(sizeof(A*));
    else p=(A**)realloc(p, sizeof(A*)*(p_n+ 1 ));

    p[p_n]=this;
    p_n++;
}

void A::print() {
    int i;
    for (i= 0  ; i<p_n ; i++) printf("%d ", p[i]->a);
}
...
Рейтинг: 0 / 0
28.06.2006, 16:09
    #33819717
Господа, помогите на простом примере понять как это реализуется (С++)
AkhНе уверен, что это правельный/оптимальный вариант... этот вариант решения задачи может и не на столько правильный, но тоже с интересом бы разобрал его. можно пример?
...
Рейтинг: 0 / 0
28.06.2006, 16:11
    #33819722
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Господа, помогите на простом примере понять как это реализуется (С++)
Спешали, вор ю.

Сам очень редко использую.
...
Рейтинг: 0 / 0
28.06.2006, 16:42
    #33819825
Господа, помогите на простом примере понять как это реализуется (С++)
хм..., довольно новороченно получилось... а в main() что?
...
Рейтинг: 0 / 0
28.06.2006, 16:50
    #33819852
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Господа, помогите на простом примере понять как это реализуется (С++)
Трудно догадаться?
...
Рейтинг: 0 / 0
28.06.2006, 17:16
    #33819931
Господа, помогите на простом примере понять как это реализуется (С++)
да нет, не трудно :)
Код: 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.
#include <iostream.h>
#include <stdlib.h>

class A;
class A {
    public:
        A(int n);
	int a;

        static A **p;
	static int p_n;
	static void print();
};

A **A::p=NULL;
int A::p_n= 0 ;

A::A(int n) {
    a=n;

    if (p==NULL) p=(A**)malloc(sizeof(A*));
    else p=(A**)realloc(p, sizeof(A*)*(p_n+ 1 ));

    p[p_n]=this;
    p_n++;
}

void A::print() {
    int i;
    for (i= 0  ; i<p_n ; i++) cout<<("%d ", p[i]->a);
}

int main()
{
	A aaa( 6 );
	A bbb( 2 );
	A ccc( 5 );
	A::print();
}
в итоге ответ: цифры которые в скобках. я может быть не так что то понимаю, но мне казалось, что должны выводиться "aaa", "bbb", "ccc". Или исходя из поставленного задания это не так?
...
Рейтинг: 0 / 0
28.06.2006, 17:29
    #33819971
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Господа, помогите на простом примере понять как это реализуется (С++)
все правильно, ибо имена переменных не будут известны при исполнении, это просто адреса в памяти. и тут выводятся данные, содержащиеся в объектах
...
Рейтинг: 0 / 0
28.06.2006, 17:30
    #33819975
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Господа, помогите на простом примере понять как это реализуется (С++)
Передавай вместо цифр имя объекта
...
Рейтинг: 0 / 0
28.06.2006, 17:41
    #33820005
Господа, помогите на простом примере понять как это реализуется (С++)
так при поставленном задании что нужно получить всё таки? цифры те что в ( ) или сами ааа, bbb, ccc ?
А ааа(А ааа); так что ли?
...
Рейтинг: 0 / 0
28.06.2006, 17:41
    #33820006
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Господа, помогите на простом примере понять как это реализуется (С++)
А чтобы не дублировать информацию можешь написать макрос для создания объекта, например:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
#define CREATE_CLASS_A(class_name) class_name( #class_name );

...

A CREATE_CLASS_A(aaa);
A CREATE_CLASS_A(bbb);
A CREATE_CLASS_A(ccc);
...
Рейтинг: 0 / 0
28.06.2006, 17:43
    #33820014
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Господа, помогите на простом примере понять как это реализуется (С++)
"функцию вывода всех созданных объектов класса?" - я бы это понял как вывод содержимого объектов - то есть их полей. Что и сделал Akh.
...
Рейтинг: 0 / 0
28.06.2006, 17:44
    #33820017
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Господа, помогите на простом примере понять как это реализуется (С++)
Владимир С.Г.так при поставленном задании что нужно получить всё таки? цифры те что в ( ) или сами ааа, bbb, ccc ?

Смортя, что понимать под "выводом объекта".
...
Рейтинг: 0 / 0
28.06.2006, 19:12
    #33820244
Господа, помогите на простом примере понять как это реализуется (С++)
ну да, согласен :) видимо имеется ввиду именно содержимое объекта. ну тогда все работает. а тогда зачем вместо цифр передавать имена объектов? у нас ведь данные внутри класса цифрового формата.
...
Рейтинг: 0 / 0
28.06.2006, 21:16
    #33820368
Господа, помогите на простом примере понять как это реализуется (С++)
хм..., а как переписать этот пример чтоб он был без динамического выделения памяти и без двойного указателя?
...
Рейтинг: 0 / 0
28.06.2006, 21:42
    #33820394
PPA
PPA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Господа, помогите на простом примере понять как это реализуется (С++)
Владимир С.Г.хм..., а как переписать этот пример чтоб он был без динамического выделения памяти и без двойного указателя?

std::vector
...
Рейтинг: 0 / 0
28.06.2006, 21:53
    #33820401
Господа, помогите на простом примере понять как это реализуется (С++)
ну а как через вектор сделать? про векторы читал, честное слово, и даже с помощью них чего-то крапал...
...
Рейтинг: 0 / 0
28.06.2006, 22:28
    #33820427
Господа, помогите на простом примере понять как это реализуется (С++)
ваяю свое без динамического распределения памяти, двойных указателей и векторов... если кто знает подскажите пожалуйста где я не прав???
Код: 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.
class drob
{
	double chisl; 
	double znam;
	static int kol;
	static drob* set[];
public: 
//	drob(double c, double z) {c=chisl; z=znam; set[kol++] = this;}
	drob(double chisl= 1 . 0 , double znam= 1 . 0 );
	void PrintSum ();
	static void disp();
};
//---------------------------------
int drob::kol =  0 ;
drob* drob::set[ 10 ];
//---------------------------------
drob::drob(double chisl= 1 . 0 , double znam= 1 . 0 )
{   //error: 'drob::drob' : redefinition of default parameter : parameter 2
    // error: 'drob::drob' : redefinition of default parameter : parameter 1
	double c=chisl; 
	double z=znam; 
	set[kol++]=this;
}
//----------------------------------
void drob :: PrintSum ()
{
	cout << ("%d",chisl) << ',';
	cout << ("%d",znam) << endl;
}
//----------------------------------
void drob::disp()
{
	for (int i= 0 ; i<kol; i++)
	{
		set[i]->PrintSum();
	}
	cout << "Vsego " << kol << " objektov" << endl;
}
//----------------------------------
int main()
{
	drob a1( 4 . 0 ,  2 . 0 );
	drob a2( 6 . 0 ,  3 . 0 );
	drob a3( 10 . 0 ,  5 . 0 );
	drob::disp();
}
если я пишу не конструктор по умолчанию (хотя именно он мне и нужен), то выводится на экран всякая хрень, вместо:
4.0, 2.0
6.0, 3.0
10.0, 5.0
количество объектов считает правильно...
подскажите, пожалуста где я не так написал? если можно - подправьте как правильно это делается. очень нужно, правда!
...
Рейтинг: 0 / 0
28.06.2006, 23:09
    #33820464
PPA
PPA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Господа, помогите на простом примере понять как это реализуется (С++)
Код: 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.
#include <iostream>
#include <set>

class A
{
        int a;
        static std::set<A*> p;
    public:
        A( int n )  : a( n )
         {
             p.insert( this );
         }
        virtual ~A()
         {
             p.erase( this );
         }
        static void print()
             {
                for ( std::set<A*>::const_iterator i = p.begin() ; i != p.end() ; ++i )
                      std::cout << (*i)->a;
             }
};
std::set<A*> A::p;

int main( int argc, char* argv[] )
{
        A aaa( 6 );
	A bbb( 2 );
	A ccc( 5 );
	A::print();
}
p.s.
если важна хронология создания, то нужно воспользоваться
другим контейнером.
...
Рейтинг: 0 / 0
29.06.2006, 04:00
    #33820598
Господа, помогите на простом примере понять как это реализуется (С++)
видимо сообщения мы отправили одновременно. почему же у меня не работает конструктор по умолчанию? и выдается всякая ересь?
Код: 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.
class drob
{
	double chisl; 
	double znam;
	static int kol;
	static drob* set[];
public: 
	drob(double c= 1 . 0 , double z= 1 . 0 );
	void PrintSum ();
	static void disp();
};

int drob::kol =  0 ;
drob* drob::set[ 10 ];

drob::drob(double c= 1 . 0 , double z= 1 . 0 )
{  //'drob::drob' : redefinition of default parameter : parameter 2
   //'drob::drob' : redefinition of default parameter : parameter 1
	chisl=c; 
	znam=z; 
	set[kol++]=this;
}

void drob :: PrintSum ()
{
	cout << ("%d",chisl) << ',';
	cout << ("%d",znam) << endl;
}

void drob::disp()
{
	for (int i= 0 ; i<kol; i++)
	{
		set[i]->PrintSum();
	}
	cout << "Vsego " << kol << " objektov" << endl;
}

int main()
{
	drob a1( 4 . 0 ,  2 . 0 );
	drob a2( 6 . 0 ,  3 . 0 );
	drob a3( 10 . 0 ,  5 . 0 );
	drob::disp();
}
...
Рейтинг: 0 / 0
29.06.2006, 06:28
    #33820631
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Господа, помогите на простом примере понять как это реализуется (С++)
Владимир С.Г.
как например написать статическую функцию вывода всех созданных объектов класса?


Для того, чтобы написать такую функцию, тебе нужно иметь этот список всех созданных объектов этого класса.
Для того чтобы его иметь, надо во всех конструкторах регистрировать созданные объекты в этом списке. В деструкторах соответственно разрегистрировать. Если нужно multi-threading, нужно синхронизировать доступ к этому списку (он должен быть глобальным для программы). Статические объекты этого класса надо тоже будет как-то особо обрабатывать или прилагать усилия чтобы все работало.

Владимир С.Г.
как будет выглядеть программа? искал что-то подобное и не нашел.


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


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