Форум программистов, компьютерный форум CyberForum.ru

Statiс Поля Класса - C++

Восстановить пароль Регистрация
 
SatOleg
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 30
05.08.2011, 15:48     Statiс Поля Класса #1
Имея класс
C++
1
2
3
4
5
6
7
8
9
10
class Worker
{
    static const int Part2 = 0x22;
    static const int Part3 = 0x44;
public:
        static int Part1;
    int part1(){return [B]Part1[/B];} // не могу обратиться к полю
    int part2(){return Part2;}
    int part3(){return Part3;}
};
// Вне класса тоже не могу обратиться

Worker::Part1 = 0x11;

Вполне вероятно, что мое заблуждение очень глупое, спс если сможете помочь.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silentnuke
Android Programmer
137 / 138 / 5
Регистрация: 08.12.2010
Сообщений: 421
05.08.2011, 15:50     Statiс Поля Класса #2
а где вы его проинициализировали?
SatOleg
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 30
05.08.2011, 15:53  [ТС]     Statiс Поля Класса #3
Цитата Сообщение от silentnuke Посмотреть сообщение
а где вы его проинициализировали?
Никак, а что именно требуется проинициализировать?
Вернее не что, а как надо
silentnuke
Android Programmer
137 / 138 / 5
Регистрация: 08.12.2010
Сообщений: 421
05.08.2011, 15:54     Statiс Поля Класса #4
Цитата Сообщение от SatOleg Посмотреть сообщение
Никак, а что именно требуется проинициализировать?
static да.
C++
1
2
3
4
5
6
7
8
9
10
11
class Worker
{
    static const int Part2 = 0x22;
    static const int Part3 = 0x44;
public:
    static int Part1;
    int part1(){return Part1;}
    int part2(){return Part2;}
    int part3(){return Part3;}
};
int Worker::Part1=0;
а дальше уже делайте что хотите.
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
05.08.2011, 15:54     Statiс Поля Класса #5
SatOleg,
C++
1
int Worker::Part1 = 0x11;
Сыроежка
Заблокирован
05.08.2011, 16:13     Statiс Поля Класса #6
Цитата Сообщение от SatOleg Посмотреть сообщение
Имея класс
class Worker
{
static const int Part2 = 0x22;
static const int Part3 = 0x44;
public:
static int Part1;
int part1(){return Part1;} // не могу обратиться к полю
int part2(){return Part2;}
int part3(){return Part3;}
};

// Вне класса тоже не могу обратиться

Worker::Part1 = 0x11;

Вполне вероятно, что мое заблуждение очень глупое, спс если сможете помочь.
Дело в том, что вы только объявили переменную Part1, но не определили ее. Необходимо ее определить, чтобы компилятор выделил для нее адрес. Если статические константы можно инициализировать внутри класса, то не константы нужно определять вне класса. Например,

C++
1
int Worker::Part1 = 0x11;
SatOleg
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 30
05.08.2011, 16:28  [ТС]     Statiс Поля Класса #7
Всем расставил спс.

Еще 1 вопрос у меня есть два класса

C
1
2
3
4
5
6
7
8
9
10
class Chicken;
class Egg {
public:
    Chicken * creator;
    Chicken getCreator()
    {
        if (!creator) exit(1);
        return *creator;
    }
};
и

C
1
2
3
4
5
6
7
8
9
10
class Egg;
class Chicken {
public:
    Egg * creator;
    Egg getCreator()
    {
        if (!creator) exit(1);
        return *creator;
    }
};
получается, что классы ссылаются друг на друга

Хотелось бы чтобы можно было выполнить функцию

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void chicken_and_egg()
{
    using Zoo::Chicken;
    typedef Zoo::Egg Egg;
    Chicken chicken;
    Egg egg;
    chicken.creator = &egg;
    egg.creator = &chicken;
    Egg e = chicken.getCreator();
    Chicken c = egg.getCreator();
    if( chicken.creator == c.creator 
        && egg.creator == e.creator )
    {
        using namespace std;
        cout << "the `Chicken and Egg' dilemma is solved!" << endl;
    }
}
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
05.08.2011, 16:48     Statiс Поля Класса #8
SatOleg, сделай определение метода Chicken Egg::getCreator();
после определения классов
SatOleg
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 30
05.08.2011, 17:20  [ТС]     Statiс Поля Класса #9
Цитата Сообщение от OstapBender Посмотреть сообщение
SatOleg, сделай определение метода Chicken Egg::getCreator();
после определения классов
Полностью решило проблему.

И на счет виртуальных методов:

Имеется родительский класс
C
1
2
3
4
5
6
7
8
9
class Pet
{
public:
    virtual const char * say() = 0;
    virtual bool gnaw() = 0;
protected:
    friend void pets( bool flag = false );
    int lifes(); 
};
потомок
C
1
2
3
4
5
6
7
8
class Cat : Pet
{
public:
    virtual const char * say( void ) { return "miaow" ; }
    virtual bool gnaw( void* ) { return false; }
protected:
    virtual int lifes( void ) { return 9; }
};
и функция где я обращаюсь к наследнику класса

C++
1
2
3
4
5
6
void pets()
{
    Cat cat;
        Pet & myCat = cat;
        printf( "myCat says `%s', gnows %sthing and has %d lifes\n" ,myCat.say() , myCat.gnaw() ? "no" : "every" , myCat.lifes() ); 
}
Хотелось бы узнать где заблуждение . Всем спс
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2011, 22:03     Statiс Поля Класса
Еще ссылки по теме:

C++ Вывести поля класса
C++ Друзья, подскажите, говорят, что можно поля класса инициализировать в момент объявления класса. Как это сделать?
Передача поля класса C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
05.08.2011, 22:03     Statiс Поля Класса #10
gnaw(void*) в наследнике не совпадает по сигнатуре с базовым...
Уберите нафиг все void в функциях без параметров. Это С++ а не Си
И работать стоит через указатели. + к тому lifes в базовом не виртуальная.
Да и наследование закрытое...
Yandex
Объявления
05.08.2011, 22:03     Statiс Поля Класса
Ответ Создать тему
Опции темы

Текущее время: 17:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru