С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
SatOleg
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 30
#1

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

05.08.2011, 15:48. Просмотров 817. Ответов 9
Метки нет (Все метки)

Имея класс
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;

Вполне вероятно, что мое заблуждение очень глупое, спс если сможете помочь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.08.2011, 15:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Statiс Поля Класса (C++):

Использование в качестве поля класса указатель на объект другого класса - C++
Ошибка в названии - "указателЯ" Вот, пытаюсь освоить ООП (пока только учусь): создаю класс person (человек) и car (модель машины). ...

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

В конструкторе вложенного класса инициализируется приватное поле. Потом вызывается функция-метод этого класса и выводит значение этого поля НО НЕ ТО! - C++
Друзья! Почему так? #include <windows.h> #include <iostream> using namespace std; //Вот главный класс class A{ ...

поля класса - C++
Задача заключается в поиске площади треугольника через класс. Программой должна быть предусмотрена проверка корректности ввода сторон...

Поля класса - C++
здравствуйте ) извините заранее если глупый вопрос :sorry: я просто новичок) class mycl { public: char a, b; }; ...

Поля дружественного класса - C++
есть примерно такой код class ClientAuthorization { public: int count; //считается в конструкторе, не буду писать весь код,...

9
silentnuke
Android Programmer
139 / 140 / 5
Регистрация: 08.12.2010
Сообщений: 421
05.08.2011, 15:50 #2
а где вы его проинициализировали?
0
SatOleg
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 30
05.08.2011, 15:53  [ТС] #3
Цитата Сообщение от silentnuke Посмотреть сообщение
а где вы его проинициализировали?
Никак, а что именно требуется проинициализировать?
Вернее не что, а как надо
0
silentnuke
Android Programmer
139 / 140 / 5
Регистрация: 08.12.2010
Сообщений: 421
05.08.2011, 15:54 #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;
а дальше уже делайте что хотите.
1
ValeryLaptev
Эксперт С++
1046 / 825 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
05.08.2011, 15:54 #5
SatOleg,
C++
1
int Worker::Part1 = 0x11;
1
Сыроежка
Заблокирован
05.08.2011, 16:13 #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;
2
SatOleg
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 30
05.08.2011, 16:28  [ТС] #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;
    }
}
0
OstapBender
584 / 523 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
05.08.2011, 16:48 #8
SatOleg, сделай определение метода Chicken Egg::getCreator();
после определения классов
1
SatOleg
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 30
05.08.2011, 17:20  [ТС] #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() ); 
}
Хотелось бы узнать где заблуждение . Всем спс
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
05.08.2011, 22:03 #10
gnaw(void*) в наследнике не совпадает по сигнатуре с базовым...
Уберите нафиг все void в функциях без параметров. Это С++ а не Си
И работать стоит через указатели. + к тому lifes в базовом не виртуальная.
Да и наследование закрытое...
0
05.08.2011, 22:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2011, 22:03
Привет! Вот еще темы с ответами:

Передача поля класса - C++
Всем доброй ночи. Возникла необходимость передачи поля одного класса, в качестве аргумента метода другого класса. Но ввиду недостатка...

Закрытые поля класса - C++
Здравствуйте.Помогите разобраться с кодом. Определен следующий класс: struct Cls { Cls(char c, double d, int i); private: ...

Статические поля класса - C++
Не подскажете как инициализировать статический массив? Но чтобы я сам мог ввести этот массив.

Static поля класса - C++
объясните нубу, вот имею я такой код на С# class WebResponse { public static string GET(string Url, string Data) ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.