русский
Germany.ruForen → Архив Досок→ Programmierung

overload static data member

187  1 2 3 alle
desyman свой человек22.12.06 14:15
desyman
22.12.06 14:15 

class A
{
static float a;
};
A::a = 1.0;
class B::piblic A
{
static float a;
};
B::a = 2.0;
main()
{
cout << A::a << endl;
cout << B::a << endl;
}
вопрос такой:
хочется chtoby staticheskie peremennye dlja dvuh klassov byli raznymi
#1 
  scorpi_ nobody22.12.06 15:50
NEW 22.12.06 15:50 
in Antwort desyman 22.12.06 14:15
Ну так используй, в чём проблема-то? Я например в своей JNI-библиотеке использовал в каждом сгенерированном классе
	static JClass this_class_;
static const char* CLASS_NAME;


#2 
Murr коренной житель22.12.06 17:10
Murr
NEW 22.12.06 17:10 
in Antwort desyman 22.12.06 14:15

хочется chtoby staticheskie peremennye dlja dvuh klassov byli raznymi
------
вопрос такой:
А как их можно сделать одинаковыми?
#3 
desyman свой человек24.12.06 11:41
desyman
NEW 24.12.06 11:41 
in Antwort Murr 22.12.06 17:10, Zuletzt geändert 24.12.06 11:42 (desyman)
одинаковыми они будут всегда, если они не переопределены в дочернем классе
статик = типа глобальная переменная данного контекста
где-то нашел такию фразу,
"статик переменная занимает одну и ту же ячейку памяти для всех обэктов данного класса и классов-потомков."
собстна в етом и вопрос: возможно ли их переопределить если они статик ?
идеологически ето будет неверно и вроде как в некотором смысле нарушать принцип обявления статик переменной.
#4 
Murr коренной житель24.12.06 12:45
Murr
NEW 24.12.06 12:45 
in Antwort desyman 24.12.06 11:41
Ты бы определился с тем, что тебе надо.
Ну и это - читать надо бы научиться...
#5 
desyman свой человек24.12.06 12:48
desyman
NEW 24.12.06 12:48 
in Antwort Murr 24.12.06 12:45
через статик не получилося
сделал через глобальные переменные
#6 
desyman свой человек24.12.06 12:49
desyman
NEW 24.12.06 12:49 
in Antwort Murr 24.12.06 12:45
про чтение поподробнее плз
#7 
desyman свой человек24.12.06 12:54
desyman
NEW 24.12.06 12:54 
in Antwort scorpi_ 22.12.06 15:50
если в классе член статик, то все ок, и во всех дочерных классах виден он же.
вот когда я его в одном из дочерных классов хочу переопределить. то значение переменной берется из родительского класса
вот и не пойму я не фига. компайлер не ругается. говорит все тип топ
#8 
Murr коренной житель24.12.06 12:54
Murr
NEW 24.12.06 12:54 
in Antwort desyman 24.12.06 12:49
про чтение поподробнее плз
------
Читать, до полного осознания:
"статик переменная занимает одну и ту же ячейку памяти для всех обэктов данного класса и классов-потомков."
#9 
Murr коренной житель24.12.06 12:58
Murr
NEW 24.12.06 12:58 
in Antwort desyman 24.12.06 12:54
вот и не пойму я не фига.
-----
читай про операторы: :: и ->
#10 
Simple Nothing is f*cked24.12.06 13:03
Simple
NEW 24.12.06 13:03 
in Antwort desyman 24.12.06 12:48
Это, по-моему, еще хуже. Ты бы описал, что ты хочешь сделать.
#11 
desyman свой человек24.12.06 13:32
desyman
NEW 24.12.06 13:32 
in Antwort Simple 24.12.06 13:03
есть абстрактный класс
ТХелих
у которого есть 10 разных дочерних классов (различия только в кострукторах)
необходимо добавить набор переменных (характеристик) во все обекты произведенные дочерними классами
набор характеристик и операзии с ними - те же для каждого из 10 дочерних классов (поетому хотелось добавить все в ТХелих)
значения характеристик - различаются для некоторых из дочерных классов, но неизменны для обектов одного класса (поетому хочется сделать их статик)
#12 
Simple Nothing is f*cked24.12.06 17:05
Simple
NEW 24.12.06 17:05 
in Antwort desyman 24.12.06 13:32
по-моему, классический случай для traits.
#13 
  scorpi_ nobody24.12.06 17:07
NEW 24.12.06 17:07 
in Antwort Simple 24.12.06 17:05
На первый постинг посмотри, и посчитай ошибки. А потом подумай, не рановато ли автору говорить о продвинутых фичах.
#14 
Simple Nothing is f*cked24.12.06 17:13
Simple
NEW 24.12.06 17:13 
in Antwort scorpi_ 24.12.06 17:07
Я и сам еще только учусь :)
#15 
desyman свой человек24.12.06 18:16
desyman
NEW 24.12.06 18:16 
in Antwort scorpi_ 24.12.06 17:07
я вижу только две опечатки
#16 
  scorpi_ nobody24.12.06 18:23
NEW 24.12.06 18:23 
in Antwort desyman 24.12.06 18:16, Zuletzt geändert 24.12.06 18:23 (scorpi_)
Ну попробуй откомпилировать. Вообще постить полагается компилируемые куски кода, иначе ты просто проявляешь неуважение к собеседникам. То бишь ты должен был запостить такой вот кусок кода:
В ответ на:
#include <iostream>
using namespace std;
struct A
{
static float a;
};
float A::a = 1.0;
struct B : public A
{
static float a;
};
float B::a = 2.0;
int main()
{
cout << A::a << endl;
cout << B::a << endl;
}


#17 
desyman свой человек24.12.06 19:04
desyman
NEW 24.12.06 19:04 
in Antwort scorpi_ 24.12.06 18:23
я согласен с тем что етот код должен работать в обшем смысле и в конкретном частном примере тоже.
я привел пример кода весьма упрошенно чтобы описать проблему. в моей конкретной имплементации етот вариант не работает.
если я буду тут постить все свои ис ходники ты вы тут будете читать до полуночи
чего я и старался избежать
#18 
desyman свой человек24.12.06 19:45
desyman
NEW 24.12.06 19:45 
in Antwort scorpi_ 24.12.06 18:23, Zuletzt geändert 24.12.06 19:51 (desyman)

#include <iostream>
using namespace std;
class A
{
protected:
double a;
public:
void set(double i){a=i;}
double* get(){return &a;}
};
//float* A::a=(float*) 1;
class B:public A
{
protected:
static double a;
public:
};
double B::a= (double) 2;
A a_arr[10];
B b_arr[10];
int main ()
{
for(int i=0;i<10;++i)
{
a_arr.set((double) i);
b_arr.set((double) i);
printf("%d A::a = %p %2.0f B::a = %p %2.0f \n",
i, (a_arr.get()), *(a_arr.get()), (b_arr.get()), *(b_arr.get()));
}
return 1;
}


#19 
  scorpi_ nobody24.12.06 19:48
NEW 24.12.06 19:48 
in Antwort desyman 24.12.06 19:04
Всё не надо. Надо упрощённый до предела работающий пример. И я так и не понял, что у тебя не работает. В твоём примере обе строчки выводят разные значения.
#20 
desyman свой человек24.12.06 19:58
desyman
NEW 24.12.06 19:58 
in Antwort scorpi_ 24.12.06 19:48, Zuletzt geändert 24.12.06 20:00 (desyman)
в последнем примере
игнорируется обявление static double a
почему ??
#21 
  scorpi_ nobody24.12.06 20:04
NEW 24.12.06 20:04 
in Antwort desyman 24.12.06 19:45
Compiling...
main.cpp
i:\projects\source\test\main.cpp(32) : error C2228: left of '.set' must have class/struct/union
type is 'A [10]'
i:\projects\source\test\main.cpp(33) : error C2228: left of '.set' must have class/struct/union
type is 'B [10]'
i:\projects\source\test\main.cpp(35) : error C2228: left of '.get' must have class/struct/union
type is 'A [10]'
i:\projects\source\test\main.cpp(35) : error C2228: left of '.get' must have class/struct/union
type is 'A [10]'
i:\projects\source\test\main.cpp(35) : error C2228: left of '.get' must have class/struct/union
type is 'B [10]'
i:\projects\source\test\main.cpp(35) : error C2228: left of '.get' must have class/struct/union
type is 'B [10]'
6 error(s), 0 warning(s)
#22 
  joldosch посетитель26.12.06 10:11
joldosch
NEW 26.12.06 10:11 
in Antwort scorpi_ 24.12.06 20:04
for(int i=0;i<10;++i)
{
a_arr.set((double) i);
b_arr.set((double) i);
Index упущен...
#23 
  joldosch посетитель26.12.06 10:27
joldosch
NEW 26.12.06 10:27 
in Antwort scorpi_ 24.12.06 20:04
Тебе нужно в дочернем классе переписать метод "set", в котором ты должен указать на переменную "а" из класса "А" как this::a (Я не уверен в правильности синтакса...).
А вообще-то у тебя две разные переменные и почему ты их одним именем обозвал?...
#24 
  joldosch посетитель26.12.06 10:36
joldosch
NEW 26.12.06 10:36 
in Antwort scorpi_ 24.12.06 20:04
Э-э... прошу прощения, последнее адресовано вопрошающему.
#25 
desyman свой человек26.12.06 18:01
desyman
NEW 26.12.06 18:01 
in Antwort joldosch 26.12.06 10:27
обозвал одним именем, чтобы в дочернем классе
пользоватся методами родительского класса
#26 
desyman свой человек26.12.06 18:37
desyman
NEW 26.12.06 18:37 
in Antwort desyman 22.12.06 14:15, Zuletzt geändert 26.12.06 18:48 (desyman)

В ответ на:

#include <iostream>
using namespace std;
class A
{
protected:
// static double a;
double a;
public:
void set(const double i){this->a=i;}
double* get(){return &(this->a);}
};
class B:public A
{
protected:
static double a;
public:
};
class C:public A
{
protected:
static double a;
public:
};
//double A::a= (double) 1;
double B::a= (double) 2;
double C::a= (double) 3;
B b_arr[5];
C c_arr[5];
int main ()
{
for(int k=0;k<5;++k)
{
b_arr[k].set((double) 4);
// c_arr[k].set((double) 5);
printf("%d C::a = %p %2.0f B::a = %p %2.0f \n",
i,
(c_arr[k].get()), *(c_arr[k].get()),
(b_arr[k].get()), *(b_arr[k].get())
);
}
return 1;
}
0 C::a = 0x8049ac0 0 B::a = 0x8049a80 4
1 C::a = 0x8049ac8 0 B::a = 0x8049a88 4
2 C::a = 0x8049ad0 0 B::a = 0x8049a90 4
3 C::a = 0x8049ad8 0 B::a = 0x8049a98 4
4 C::a = 0x8049ae0 0 B::a = 0x8049aa0 4


a nado tak:
0 C::a = 0x8049ac0 3 B::a = 0x8049a80 4
1 C::a = 0x8049ac0 3 B::a = 0x8049a80 4
2 C::a = 0x8049ac0 3 B::a = 0x8049a80 4
3 C::a = 0x8049ac0 3 B::a = 0x8049a80 4
4 C::a = 0x8049ac0 3 B::a = 0x8049a80 4

#27 
  scorpi_ nobody26.12.06 19:21
NEW 26.12.06 19:21 
in Antwort desyman 26.12.06 18:37, Zuletzt geändert 26.12.06 19:22 (scorpi_)
Да Вам батенька учебник курить надо. Вы же совершенно не понимаете, что такое static. Ваши get и set обращаются в любом случае к A::a, статические переменные B::a и C::a здесь просто остаются за кадром. И нафига тут вообще масивы и геты/сеты, когда мы говорим о статических переменных, которые для всех инстанций класса тождественны?
Что Вам здесь непонятно?
В ответ на:
#include <iostream>
using namespace std;
struct A { static double a; };
struct B : public A { static double a; };
struct C : public A { static double a; };
double A::a = 1.;
double B::a = 2.;
double C::a = 3.;
int main ()
{
cout << A::a << "\n" << B::a << "\n" << C::a << endl;
}
Ausgabe:
1
2
3


#28 
Murr коренной житель26.12.06 21:11
Murr
NEW 26.12.06 21:11 
in Antwort desyman 26.12.06 18:01
обозвал одним именем, чтобы в дочернем классе
пользоватся методами родительского класса
------
Ну а если все же использовать то место, которым должно думать?
Например, попытаться ответить на абсолютно идиотский вопрос:
- А как родительский класс узнает каким классом он унаследован?
Ну или на другой:
- А что если наследников - несколько?
А вообще - стоит что-нибудь почитать по ООП...
#29 
Simple Nothing is f*cked27.12.06 10:59
Simple
NEW 27.12.06 10:59 
in Antwort Murr 26.12.06 21:11
> А как родительский класс узнает каким классом он унаследован?
Вопрос действительно идиотский. Читай учебник ;)
#30 
desyman свой человек27.12.06 12:27
desyman
NEW 27.12.06 12:27 
in Antwort Simple 27.12.06 10:59, Zuletzt geändert 27.12.06 12:27 (desyman)

#include <iostream>
using namespace std;
class A
{
protected:
public:
virtual void set(double i) = 0;
virtual double get() const = 0;
};
//float* A::a=(float*) 1;
class B:public A
{
protected:
static double a;
public:
virtual void set(double i) { a =i;}
virtual double get() const { return a;}
};
class C:public A
{
protected:
static double a;
public:
virtual void set(double i) { a =i;}
virtual double get() const { return a;}
};
double B::a= (double) 22;
double C::a= (double) 33;
B b_arr[10];
C c_arr[10];
int main ()
{
for(int j=0;j<10;++j)
{
printf("%d B::a = %2.0f C::a = %2.0f \n",
i,
(b_arr[j].get()),
(c_arr[j].get()));
}
return 1;
}


#31 
desyman свой человек27.12.06 12:39
desyman
NEW 27.12.06 12:39 
in Antwort desyman 27.12.06 12:27, Zuletzt geändert 27.12.06 12:41 (desyman)
ок
переформулирую свой вопрос немножко
возможно ли, не используя статик и глобальные переменные,
разделить члены данные для дочерных классов не определяя по-новому для каждого дочернего класса члены методы, работаюшие с этими членами данными
-
Симпл предложил воспользоватся траитс, но честно говоря и вправду трудновато для понимания с первого раза.
#32 
  Chipolino местный житель27.12.06 14:35
NEW 27.12.06 14:35 
in Antwort desyman 24.12.06 13:32
В ответ на:

значения характеристик - различаются для некоторых из дочерных классов, но неизменны для обектов одного класса (поетому хочется сделать их статик)

Почему не сделаешь их константами ?
Статик-с другой оперы .
#33 
  Chipolino местный житель27.12.06 14:48
NEW 27.12.06 14:48 
in Antwort desyman 27.12.06 12:27
В ответ на:

int main ()
{
for(int j=0;j<10;++j)
{
printf("%d B::a = %2.0f C::a = %2.0f \n",
i,
(b_arr[j].get()),
(c_arr[j].get()));
}
return 1;
}

у тебя и здесь ошибка
в printf - j,не i
И почему ты вообще используешь сишные функции , вместо плюсовых обьектов ?
#34 
desyman свой человек27.12.06 15:25
desyman
NEW 27.12.06 15:25 
in Antwort Chipolino 27.12.06 14:35
В ответ на:

В ответ на:
значения характеристик - различаются для некоторых из дочерных классов, но неизменны для обектов одного класса (поетому хочется сделать их статик)
Почему не сделаешь их константами ?
Статик-с другой оперы .

конст = не перезаписываемая
статик = одно и то же значение для всех обектов (инициаций) класса
мне нужно второе
#35 
desyman свой человек27.12.06 15:26
desyman
NEW 27.12.06 15:26 
in Antwort Chipolino 27.12.06 14:48
сорри,
опечатка
#36 
  Chipolino местный житель27.12.06 17:54
NEW 27.12.06 17:54 
in Antwort desyman 27.12.06 15:25, Zuletzt geändert 27.12.06 17:59 (Chipolino)
В ответ на:

но неизменны для обектов одного класса

Дык сам написал неизменяемая
В ответ на:

конст = не перезаписываемая

Ключевое слово mutable ;-)
В ответ на:

одно и то же значение для всех обектов (инициаций) класса

Может инстанций ?
ЗЫ.Постарайся сформулировать свою проблему человеческим,русским языком.
Чего , конкретно , ты хочешь добиться ?
#37 
desyman свой человек27.12.06 17:55
desyman
NEW 27.12.06 17:55 
in Antwort Chipolino 27.12.06 14:48
мм
еше вопрос:
о каких обектах реч?
#38 
desyman свой человек27.12.06 18:14
desyman
NEW 27.12.06 18:14 
in Antwort Chipolino 27.12.06 17:54
с русским языком у меня вот особенно туго
попробую обяснить в н-ый раз (может хоть сам пойму наконец)
имею задачку:
добавить в ГУИ механизм ограничения визуализации списков обэктов
обекты генерятся разными классами.
класс АКласс генерит а_ентити (добавляются в список АЛист).
класс БКласс генерит б_ентити (добавляются в список БЛист).
{пересчитал. итого 6 таких классов и соответственно 6 списков).
классы АКласс,БКласс.. наследуют от ПКласс (родительский класс). различия между дочерними классами не велико. 3-4 метода.
списки обектов да и сами обекты хранятся в файле.
результат должен выглядеть вот так:
в клиенцком модуле я добавляю кнопки-шнопки, поля ввода,
определяю параметры визуализации
(
показывать только
обьекты А с параметром икс в пределах от 5 до 8
и
обьекты Б с параметром игрек в пределах от 2 до 6
)
вот такая задачка.
#39 
  scorpi_ nobody27.12.06 19:04
NEW 27.12.06 19:04 
in Antwort desyman 27.12.06 18:14
Ну так пиши на немецком или английском. Можешь даже на французском, я пойму.
В ответ на:
класс АКласс генерит а_ентити (добавляются в список АЛист).
класс БКласс генерит б_ентити (добавляются в список БЛист).
в клиенцком модуле я добавляю кнопки-шнопки, поля ввода,
определяю параметры визуализации
(
показывать только
обьекты А с параметром икс в пределах от 5 до 8
и
обьекты Б с параметром игрек в пределах от 2 до 6
)

И где здесь параметры одинаковые для всех инстанций класса?
#40 
desyman свой человек27.12.06 19:13
desyman
NEW 27.12.06 19:13 
in Antwort scorpi_ 27.12.06 19:04
А_икс_мин и А_икс_мах
Б_икс_мин и Б_икс_мах
...
#41 
  Chipolino местный житель27.12.06 19:18
NEW 27.12.06 19:18 
in Antwort desyman 27.12.06 18:14
Ну а в чём проблема то ? ;-)
#42 
  Chipolino местный житель27.12.06 19:20
NEW 27.12.06 19:20 
in Antwort desyman 27.12.06 19:13
В ответ на:

А_икс_мин и А_икс_мах
Б_икс_мин и Б_икс_мах

static const ?
#43 
  scorpi_ nobody27.12.06 19:22
NEW 27.12.06 19:22 
in Antwort desyman 27.12.06 19:13
То есть значения по которым объекты фильтруются? Им там вообще делать нечего. Сделай класс - условие поиска (тип объекта, мин, макс), инстанции которого являются частью запроса. И не проще ли пихнуть все эти объекты в базу данных?
#44 
  Chipolino местный житель27.12.06 19:26
NEW 27.12.06 19:26 
in Antwort desyman 27.12.06 19:13
scorpi прав.
Об этом твой класс знать не должен.
Реализуй это в самом модуле.
#45 
Murr коренной житель27.12.06 21:24
Murr
NEW 27.12.06 21:24 
in Antwort Simple 27.12.06 10:59
Читай учебник ;)
------
Мне - поздно. Бо, в данном случае я писатель...
#46 
1 2 3 alle