Login
overload static data member
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
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
NEW 22.12.06 15:50
in Antwort desyman 22.12.06 14:15
Ну так используй, в чём проблема-то? Я например в своей JNI-библиотеке использовал в каждом сгенерированном классе
static JClass this_class_;
static const char* CLASS_NAME;
NEW 22.12.06 17:10
хочется chtoby staticheskie peremennye dlja dvuh klassov byli raznymi
------
вопрос такой:
А как их можно сделать одинаковыми?
in Antwort desyman 22.12.06 14:15
хочется chtoby staticheskie peremennye dlja dvuh klassov byli raznymi
------
вопрос такой:
А как их можно сделать одинаковыми?

NEW 24.12.06 11:41
in Antwort Murr 22.12.06 17:10, Zuletzt geändert 24.12.06 11:42 (desyman)
одинаковыми они будут всегда, если они не переопределены в дочернем классе
статик = типа глобальная переменная данного контекста
где-то нашел такию фразу,
"статик переменная занимает одну и ту же ячейку памяти для всех обэктов данного класса и классов-потомков."
собстна в етом и вопрос: возможно ли их переопределить если они статик ?
идеологически ето будет неверно и вроде как в некотором смысле нарушать принцип обявления статик переменной.
статик = типа глобальная переменная данного контекста
где-то нашел такию фразу,
"статик переменная занимает одну и ту же ячейку памяти для всех обэктов данного класса и классов-потомков."
собстна в етом и вопрос: возможно ли их переопределить если они статик ?
идеологически ето будет неверно и вроде как в некотором смысле нарушать принцип обявления статик переменной.
NEW 24.12.06 12:45
in Antwort desyman 24.12.06 11:41
NEW 24.12.06 12:48
in Antwort Murr 24.12.06 12:45
NEW 24.12.06 12:54
in Antwort scorpi_ 22.12.06 15:50
если в классе член статик, то все ок, и во всех дочерных классах виден он же.
вот когда я его в одном из дочерных классов хочу переопределить. то значение переменной берется из родительского класса
вот и не пойму я не фига. компайлер не ругается. говорит все тип топ
вот когда я его в одном из дочерных классов хочу переопределить. то значение переменной берется из родительского класса
вот и не пойму я не фига. компайлер не ругается. говорит все тип топ

NEW 24.12.06 12:54
in Antwort desyman 24.12.06 12:49
про чтение поподробнее плз
------
Читать, до полного осознания:
"статик переменная занимает одну и ту же ячейку памяти для всех обэктов данного класса и классов-потомков."
------
Читать, до полного осознания:
"статик переменная занимает одну и ту же ячейку памяти для всех обэктов данного класса и классов-потомков."
NEW 24.12.06 12:58
in Antwort desyman 24.12.06 12:54
NEW 24.12.06 13:03
in Antwort desyman 24.12.06 12:48
Это, по-моему, еще хуже. Ты бы описал, что ты хочешь сделать.
NEW 24.12.06 13:32
in Antwort Simple 24.12.06 13:03
есть абстрактный класс
ТХелих
у которого есть 10 разных дочерних классов (различия только в кострукторах)
необходимо добавить набор переменных (характеристик) во все обекты произведенные дочерними классами
набор характеристик и операзии с ними - те же для каждого из 10 дочерних классов (поетому хотелось добавить все в ТХелих)
значения характеристик - различаются для некоторых из дочерных классов, но неизменны для обектов одного класса (поетому хочется сделать их статик)
ТХелих
у которого есть 10 разных дочерних классов (различия только в кострукторах)
необходимо добавить набор переменных (характеристик) во все обекты произведенные дочерними классами
набор характеристик и операзии с ними - те же для каждого из 10 дочерних классов (поетому хотелось добавить все в ТХелих)
значения характеристик - различаются для некоторых из дочерных классов, но неизменны для обектов одного класса (поетому хочется сделать их статик)
NEW 24.12.06 17:07
in Antwort Simple 24.12.06 17:05
На первый постинг посмотри, и посчитай ошибки. А потом подумай, не рановато ли автору говорить о продвинутых фичах.
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;
}
NEW 24.12.06 19:04
in Antwort scorpi_ 24.12.06 18:23
я согласен с тем что етот код должен работать в обшем смысле и в конкретном частном примере тоже.
я привел пример кода весьма упрошенно чтобы описать проблему. в моей конкретной имплементации етот вариант не работает.
если я буду тут постить все свои ис ходники ты вы тут будете читать до полуночи
чего я и старался избежать
я привел пример кода весьма упрошенно чтобы описать проблему. в моей конкретной имплементации етот вариант не работает.
если я буду тут постить все свои ис ходники ты вы тут будете читать до полуночи
чего я и старался избежать
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;
}
NEW 24.12.06 19:48
in Antwort desyman 24.12.06 19:04
Всё не надо. Надо упрощённый до предела работающий пример. И я так и не понял, что у тебя не работает. В твоём примере обе строчки выводят разные значения.
NEW 24.12.06 19:58
in Antwort scorpi_ 24.12.06 19:48, Zuletzt geändert 24.12.06 20:00 (desyman)
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)
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)
NEW 26.12.06 10:11
in Antwort scorpi_ 24.12.06 20:04
NEW 26.12.06 10:27
in Antwort scorpi_ 24.12.06 20:04
Тебе нужно в дочернем классе переписать метод "set", в котором ты должен указать на переменную "а" из класса "А" как this::a (Я не уверен в правильности синтакса...).
А вообще-то у тебя две разные переменные и почему ты их одним именем обозвал?...
А вообще-то у тебя две разные переменные и почему ты их одним именем обозвал?...
NEW 26.12.06 10:36
in Antwort scorpi_ 24.12.06 20:04
Э-э... прошу прощения, последнее адресовано вопрошающему.
NEW 26.12.06 18:01
in Antwort joldosch 26.12.06 10:27
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
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
NEW 26.12.06 21:11
in Antwort desyman 26.12.06 18:01
обозвал одним именем, чтобы в дочернем классе
пользоватся методами родительского класса
------
Ну а если все же использовать то место, которым должно думать?
Например, попытаться ответить на абсолютно идиотский вопрос:
- А как родительский класс узнает каким классом он унаследован?
Ну или на другой:
- А что если наследников - несколько?
А вообще - стоит что-нибудь почитать по ООП...
пользоватся методами родительского класса
------
Ну а если все же использовать то место, которым должно думать?
Например, попытаться ответить на абсолютно идиотский вопрос:
- А как родительский класс узнает каким классом он унаследован?

Ну или на другой:
- А что если наследников - несколько?

А вообще - стоит что-нибудь почитать по ООП...
NEW 27.12.06 10:59
in Antwort Murr 26.12.06 21:11
> А как родительский класс узнает каким классом он унаследован?
Вопрос действительно идиотский. Читай учебник ;)
Вопрос действительно идиотский. Читай учебник ;)
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;
}
NEW 27.12.06 12:39
in Antwort desyman 27.12.06 12:27, Zuletzt geändert 27.12.06 12:41 (desyman)
ок
переформулирую свой вопрос немножко
возможно ли, не используя статик и глобальные переменные,
разделить члены данные для дочерных классов не определяя по-новому для каждого дочернего класса члены методы, работаюшие с этими членами данными
-
Симпл предложил воспользоватся траитс, но честно говоря и вправду трудновато для понимания с первого раза.
переформулирую свой вопрос немножко
возможно ли, не используя статик и глобальные переменные,
разделить члены данные для дочерных классов не определяя по-новому для каждого дочернего класса члены методы, работаюшие с этими членами данными
-
Симпл предложил воспользоватся траитс, но честно говоря и вправду трудновато для понимания с первого раза.
NEW 27.12.06 14:35
Почему не сделаешь их константами ?
Статик-с другой оперы .
in Antwort desyman 24.12.06 13:32
В ответ на:
значения характеристик - различаются для некоторых из дочерных классов, но неизменны для обектов одного класса (поетому хочется сделать их статик)
значения характеристик - различаются для некоторых из дочерных классов, но неизменны для обектов одного класса (поетому хочется сделать их статик)
Почему не сделаешь их константами ?
Статик-с другой оперы .
NEW 27.12.06 14:48
у тебя и здесь ошибка
в printf - j,не i
И почему ты вообще используешь сишные функции , вместо плюсовых обьектов ?
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;
}
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
И почему ты вообще используешь сишные функции , вместо плюсовых обьектов ?
NEW 27.12.06 15:25
конст = не перезаписываемая
статик = одно и то же значение для всех обектов (инициаций) класса
мне нужно второе
in Antwort Chipolino 27.12.06 14:35
В ответ на:
В ответ на:
значения характеристик - различаются для некоторых из дочерных классов, но неизменны для обектов одного класса (поетому хочется сделать их статик)
Почему не сделаешь их константами ?
Статик-с другой оперы .
В ответ на:
значения характеристик - различаются для некоторых из дочерных классов, но неизменны для обектов одного класса (поетому хочется сделать их статик)
Почему не сделаешь их константами ?
Статик-с другой оперы .
конст = не перезаписываемая
статик = одно и то же значение для всех обектов (инициаций) класса
мне нужно второе
NEW 27.12.06 17:54
Дык сам написал неизменяемая
Ключевое слово mutable ;-)
Может инстанций ?
ЗЫ.Постарайся сформулировать свою проблему человеческим,русским языком.
Чего , конкретно , ты хочешь добиться ?
in Antwort desyman 27.12.06 15:25, Zuletzt geändert 27.12.06 17:59 (Chipolino)
В ответ на:
но неизменны для обектов одного класса
но неизменны для обектов одного класса
Дык сам написал неизменяемая
В ответ на:
конст = не перезаписываемая
конст = не перезаписываемая
Ключевое слово mutable ;-)
В ответ на:
одно и то же значение для всех обектов (инициаций) класса
одно и то же значение для всех обектов (инициаций) класса
Может инстанций ?
ЗЫ.Постарайся сформулировать свою проблему человеческим,русским языком.
Чего , конкретно , ты хочешь добиться ?
NEW 27.12.06 18:14
in Antwort Chipolino 27.12.06 17:54
с русским языком у меня вот особенно туго
попробую обяснить в н-ый раз (может хоть сам пойму наконец)
имею задачку:
добавить в ГУИ механизм ограничения визуализации списков обэктов
обекты генерятся разными классами.
класс АКласс генерит а_ентити (добавляются в список АЛист).
класс БКласс генерит б_ентити (добавляются в список БЛист).
{пересчитал. итого 6 таких классов и соответственно 6 списков).
классы АКласс,БКласс.. наследуют от ПКласс (родительский класс). различия между дочерними классами не велико. 3-4 метода.
списки обектов да и сами обекты хранятся в файле.
результат должен выглядеть вот так:
в клиенцком модуле я добавляю кнопки-шнопки, поля ввода,
определяю параметры визуализации
(
показывать только
обьекты А с параметром икс в пределах от 5 до 8
и
обьекты Б с параметром игрек в пределах от 2 до 6
)
вот такая задачка.

попробую обяснить в н-ый раз (может хоть сам пойму наконец)
имею задачку:
добавить в ГУИ механизм ограничения визуализации списков обэктов
обекты генерятся разными классами.
класс АКласс генерит а_ентити (добавляются в список АЛист).
класс БКласс генерит б_ентити (добавляются в список БЛист).
{пересчитал. итого 6 таких классов и соответственно 6 списков).
классы АКласс,БКласс.. наследуют от ПКласс (родительский класс). различия между дочерними классами не велико. 3-4 метода.
списки обектов да и сами обекты хранятся в файле.
результат должен выглядеть вот так:
в клиенцком модуле я добавляю кнопки-шнопки, поля ввода,
определяю параметры визуализации
(
показывать только
обьекты А с параметром икс в пределах от 5 до 8
и
обьекты Б с параметром игрек в пределах от 2 до 6
)
вот такая задачка.
NEW 27.12.06 19:04
in Antwort desyman 27.12.06 18:14
Ну так пиши на немецком или английском. Можешь даже на французском, я пойму.
И где здесь параметры одинаковые для всех инстанций класса?
В ответ на:
класс АКласс генерит а_ентити (добавляются в список АЛист).
класс БКласс генерит б_ентити (добавляются в список БЛист).
в клиенцком модуле я добавляю кнопки-шнопки, поля ввода,
определяю параметры визуализации
(
показывать только
обьекты А с параметром икс в пределах от 5 до 8
и
обьекты Б с параметром игрек в пределах от 2 до 6
)
класс АКласс генерит а_ентити (добавляются в список АЛист).
класс БКласс генерит б_ентити (добавляются в список БЛист).
в клиенцком модуле я добавляю кнопки-шнопки, поля ввода,
определяю параметры визуализации
(
показывать только
обьекты А с параметром икс в пределах от 5 до 8
и
обьекты Б с параметром игрек в пределах от 2 до 6
)
И где здесь параметры одинаковые для всех инстанций класса?
NEW 27.12.06 19:13
in Antwort scorpi_ 27.12.06 19:04
NEW 27.12.06 19:20
in Antwort desyman 27.12.06 19:13
NEW 27.12.06 19:22
in Antwort desyman 27.12.06 19:13
То есть значения по которым объекты фильтруются? Им там вообще делать нечего. Сделай класс - условие поиска (тип объекта, мин, макс), инстанции которого являются частью запроса. И не проще ли пихнуть все эти объекты в базу данных?
NEW 27.12.06 19:26
in Antwort desyman 27.12.06 19:13
NEW 27.12.06 21:24
in Antwort Simple 27.12.06 10:59