Вход на сайт
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 24.12.06 11:41
одинаковыми они будут всегда, если они не переопределены в дочернем классе
статик = типа глобальная переменная данного контекста
где-то нашел такию фразу,
"статик переменная занимает одну и ту же ячейку памяти для всех обэктов данного класса и классов-потомков."
собстна в етом и вопрос: возможно ли их переопределить если они статик ?
идеологически ето будет неверно и вроде как в некотором смысле нарушать принцип обявления статик переменной.
статик = типа глобальная переменная данного контекста
где-то нашел такию фразу,
"статик переменная занимает одну и ту же ячейку памяти для всех обэктов данного класса и классов-потомков."
собстна в етом и вопрос: возможно ли их переопределить если они статик ?
идеологически ето будет неверно и вроде как в некотором смысле нарушать принцип обявления статик переменной.
NEW 24.12.06 12:54
в ответ scorpi_ 22.12.06 15:50
если в классе член статик, то все ок, и во всех дочерных классах виден он же.
вот когда я его в одном из дочерных классов хочу переопределить. то значение переменной берется из родительского класса
вот и не пойму я не фига. компайлер не ругается. говорит все тип топ
вот когда я его в одном из дочерных классов хочу переопределить. то значение переменной берется из родительского класса
вот и не пойму я не фига. компайлер не ругается. говорит все тип топ

NEW 24.12.06 13:32
в ответ Simple 24.12.06 13:03
есть абстрактный класс
ТХелих
у которого есть 10 разных дочерних классов (различия только в кострукторах)
необходимо добавить набор переменных (характеристик) во все обекты произведенные дочерними классами
набор характеристик и операзии с ними - те же для каждого из 10 дочерних классов (поетому хотелось добавить все в ТХелих)
значения характеристик - различаются для некоторых из дочерных классов, но неизменны для обектов одного класса (поетому хочется сделать их статик)
ТХелих
у которого есть 10 разных дочерних классов (различия только в кострукторах)
необходимо добавить набор переменных (характеристик) во все обекты произведенные дочерними классами
набор характеристик и операзии с ними - те же для каждого из 10 дочерних классов (поетому хотелось добавить все в ТХелих)
значения характеристик - различаются для некоторых из дочерных классов, но неизменны для обектов одного класса (поетому хочется сделать их статик)
NEW 24.12.06 18:23
Ну попробуй откомпилировать. Вообще постить полагается компилируемые куски кода, иначе ты просто проявляешь неуважение к собеседникам. То бишь ты должен был запостить такой вот кусок кода:
В ответ на:
#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
в ответ scorpi_ 24.12.06 18:23
я согласен с тем что етот код должен работать в обшем смысле и в конкретном частном примере тоже.
я привел пример кода весьма упрошенно чтобы описать проблему. в моей конкретной имплементации етот вариант не работает.
если я буду тут постить все свои ис ходники ты вы тут будете читать до полуночи
чего я и старался избежать
я привел пример кода весьма упрошенно чтобы описать проблему. в моей конкретной имплементации етот вариант не работает.
если я буду тут постить все свои ис ходники ты вы тут будете читать до полуночи
чего я и старался избежать
NEW 24.12.06 19:45
#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 20:04
в ответ 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 18:37
В ответ на:
#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
Да Вам батенька учебник курить надо. Вы же совершенно не понимаете, что такое 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
в ответ desyman 26.12.06 18:01
обозвал одним именем, чтобы в дочернем классе
пользоватся методами родительского класса
------
Ну а если все же использовать то место, которым должно думать?
Например, попытаться ответить на абсолютно идиотский вопрос:
- А как родительский класс узнает каким классом он унаследован?
Ну или на другой:
- А что если наследников - несколько?
А вообще - стоит что-нибудь почитать по ООП...
пользоватся методами родительского класса
------
Ну а если все же использовать то место, которым должно думать?
Например, попытаться ответить на абсолютно идиотский вопрос:
- А как родительский класс узнает каким классом он унаследован?

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

А вообще - стоит что-нибудь почитать по ООП...
NEW 27.12.06 12:27
#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
ок
переформулирую свой вопрос немножко
возможно ли, не используя статик и глобальные переменные,
разделить члены данные для дочерных классов не определяя по-новому для каждого дочернего класса члены методы, работаюшие с этими членами данными
-
Симпл предложил воспользоватся траитс, но честно говоря и вправду трудновато для понимания с первого раза.
переформулирую свой вопрос немножко
возможно ли, не используя статик и глобальные переменные,
разделить члены данные для дочерных классов не определяя по-новому для каждого дочернего класса члены методы, работаюшие с этими членами данными
-
Симпл предложил воспользоватся траитс, но честно говоря и вправду трудновато для понимания с первого раза.
NEW 27.12.06 14:48
у тебя и здесь ошибка
в printf - j,не i
И почему ты вообще используешь сишные функции , вместо плюсовых обьектов ?
в ответ 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
конст = не перезаписываемая
статик = одно и то же значение для всех обектов (инициаций) класса
мне нужно второе
в ответ Chipolino 27.12.06 14:35
В ответ на:
В ответ на:
значения характеристик - различаются для некоторых из дочерных классов, но неизменны для обектов одного класса (поетому хочется сделать их статик)
Почему не сделаешь их константами ?
Статик-с другой оперы .
В ответ на:
значения характеристик - различаются для некоторых из дочерных классов, но неизменны для обектов одного класса (поетому хочется сделать их статик)
Почему не сделаешь их константами ?
Статик-с другой оперы .
конст = не перезаписываемая
статик = одно и то же значение для всех обектов (инициаций) класса
мне нужно второе
NEW 27.12.06 17:54
Дык сам написал неизменяемая
Ключевое слово mutable ;-)
Может инстанций ?
ЗЫ.Постарайся сформулировать свою проблему человеческим,русским языком.
Чего , конкретно , ты хочешь добиться ?
В ответ на:
но неизменны для обектов одного класса
но неизменны для обектов одного класса
Дык сам написал неизменяемая
В ответ на:
конст = не перезаписываемая
конст = не перезаписываемая
Ключевое слово mutable ;-)
В ответ на:
одно и то же значение для всех обектов (инициаций) класса
одно и то же значение для всех обектов (инициаций) класса
Может инстанций ?
ЗЫ.Постарайся сформулировать свою проблему человеческим,русским языком.
Чего , конкретно , ты хочешь добиться ?
NEW 27.12.06 18:14
в ответ 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
в ответ desyman 27.12.06 18:14
Ну так пиши на немецком или английском. Можешь даже на французском, я пойму.
И где здесь параметры одинаковые для всех инстанций класса?
В ответ на:
класс АКласс генерит а_ентити (добавляются в список АЛист).
класс БКласс генерит б_ентити (добавляются в список БЛист).
в клиенцком модуле я добавляю кнопки-шнопки, поля ввода,
определяю параметры визуализации
(
показывать только
обьекты А с параметром икс в пределах от 5 до 8
и
обьекты Б с параметром игрек в пределах от 2 до 6
)
класс АКласс генерит а_ентити (добавляются в список АЛист).
класс БКласс генерит б_ентити (добавляются в список БЛист).
в клиенцком модуле я добавляю кнопки-шнопки, поля ввода,
определяю параметры визуализации
(
показывать только
обьекты А с параметром икс в пределах от 5 до 8
и
обьекты Б с параметром игрек в пределах от 2 до 6
)
И где здесь параметры одинаковые для всех инстанций класса?