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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
Mee
14 / 14 / 1
Регистрация: 05.07.2010
Сообщений: 88
#1

Private: static - C++

14.01.2011, 00:47. Просмотров 1485. Ответов 7
Метки нет (Все метки)

В хедере есть клас point, клас точек, которые должны иметь нумерацию. В поле private у него есть static атрибут free_id, в который записывается не используемый еще номер(увеличивается на 1 при создании новой точки).
Типу того
C++
1
2
3
4
5
6
7
8
9
10
11
class Point
{
private:
    static int free_id;
    const int point_id;
    double x;
    double y;
public:
    Point (double x=0, double y=0);
    ~Point();
};
Вопрос: как и где задать стартовое значение переменной free_id?
Находится она должна именно в private, тоесть просто так в main ей нельзя присвоить значение. Желательно не использовать дополнительных функций, вообщем не менять класс.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.01.2011, 00:47     Private: static
Посмотрите здесь:

Наследование классов и обращение к Private/Static - C++
Здравствуйте! У меня возникла проблема при попытке унаследовать параметры класса... У меня есть 2 класса. Player и Enemy. У обоих есть...

Необходим общий private static-член для всех классов, сгенерированных по шаблону - C++
Здравствуйте! Мне необходим общий private static-член для всех классов, сгенерированных по шаблону, и при этом, не хочется засорять...

Private: - C++
Просто непонятка, то ли с синтаксисом, то ли с компилятором. Почему template <class T, t_uint N = -1> class List{ public: ...

Инициализация в private - C++
Объясните пожалуйста в чем собственно заключается ошибка и как ее исправить. Зарание спасибо class Menu{ private: ...

Передача в private - C++
Как можно передать эти 2 переменные : class Menu{ private: int arrow; int last_arrow;

Public и Private - C++
Доброго времени суток! Написал код и понял, что некоторые методы должны быть private, а не public. Если переношу их в private, то...

Классы и private - C++
Быстрый вопрос: правильно ли я понимаю, что если объявить данные класса вне области private, то я имею прямой доступ к данным? Т.е. с таким...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
2923 / 1352 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
14.01.2011, 00:52     Private: static #2
Например, сразу за объявлением класса.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Point
{
private:
        static int free_id;
        const int point_id;
        double x;
        double y;
public:
        Point (double x=0, double y=0);
        ~Point();
};
 
int Point::free_id = 0;
 
int main(int argc, char *argv[]) {
....
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
14.01.2011, 00:54     Private: static #3
Mee,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Point
{
private:
        static int free_id;
        const int point_id;
        double x;
        double y;
public:
    Point (double x=0, double y=0, int p_id=0):
      point_id(p_id), x(x), y(y)
        {
        }
        ~Point()
        {
        }
};
 
int Point::free_id=0;
 
int main()
{
    Point Ob;
}
Mee
14 / 14 / 1
Регистрация: 05.07.2010
Сообщений: 88
14.01.2011, 01:56  [ТС]     Private: static #4
Я пробовал этот вариант, выдает ошибку

one or more multiply defined symbols found

может разница в том, что вы показываете как сделать это в одном файле, а у меня клас объявляется в хедере, а мейн в срр файле.

Добавлено через 42 минуты
если объявить переменную в хедере, а потом подключить этот хедер в нескольких местах(у меня реализация и мейн в разных файлах), то выходит конфликт
lemegeton
2923 / 1352 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
14.01.2011, 02:07     Private: static #5
Эээ, батенька, вы забыли в хидере защиту от множественных включений.
(Хрустальный шар показал)
Mee
14 / 14 / 1
Регистрация: 05.07.2010
Сообщений: 88
14.01.2011, 02:20  [ТС]     Private: static #6
Цитата Сообщение от lemegeton Посмотреть сообщение
Эээ, батенька, вы забыли в хидере защиту от множественных включений.
(Хрустальный шар показал)
Если вы говорите о #pragma once, то оно у меня есть
lemegeton
2923 / 1352 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
14.01.2011, 02:24     Private: static #7
Значит не работает/показывайте код.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2011, 03:05     Private: static
Еще ссылки по теме:

Private наследование - C++
Добрый вечер, почему приходится подставлять явно ссылку на базовый класс - компилятор скушал - значит знает что внутри класса видно,...

Полиморфизм и private методы - C++
Почему при полиморфном вызове функции возможен вызов private метода??? Хотя бы предупреждение какое нить об изменении спецификатора доступа...

Зачем в классе private? - C++
Объясните пожалуйста кто-нибудь зачем в классе private? что он делает? и почему его не в public поставить зачем приват? Тексты надо...

доступ к private членам - C++
Здравстуйте. недавно нарвался на непонятное мне поведение в С++. Вот код: #include <iostream> class A { private: int x; ...

private, protected, public - C++
class test { public: test(); int getPrivate(); int vpublic; protected: int vprotected; private: int vprivate;


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

Или воспользуйтесь поиском по форуму:
Mr.X
Эксперт С++
3048 / 1693 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
14.01.2011, 03:05     Private: static #8
Файл point.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#pragma once
//////////////////////////////////////////////////////////////////////////////////////
class T_point
{
private:
    static int  free_id_;
public:
    const int   point_id_;
    double      x_;
    double      y_;
 
    T_point (double  x = 0, double  y = 0);
    ~T_point();
};
Файл point.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//////////////////////////////////////////////////////////////////////////////////////
#include "point.h"
#include <iostream>
//////////////////////////////////////////////////////////////////////////////////////
int  T_point::free_id_ = 0;
//////////////////////////////////////////////////////////////////////////////////////
T_point::T_point (double  x, double  y) 
    : point_id_  (free_id_++),
      x_         (x), 
      y_         (y)
{    
    std::cout << "Создан объект T_point #"
              << point_id_
              << std::endl;
}
//////////////////////////////////////////////////////////////////////////////////////
T_point::~T_point()
{
    std::cout << "Уничтожен объект T_point #"
              << point_id_
              << std::endl;
}
//////////////////////////////////////////////////////////////////////////////////////
Файл main.cpp
C++
1
2
3
4
5
6
7
8
9
//////////////////////////////////////////////////////////////////////////////////////
#include "point.h"
#include <iostream>
//////////////////////////////////////////////////////////////////////////////////////
int main()
{   
    std::locale::global(std::locale(""));
    T_point  point_arr[10] = {T_point()};
}
Yandex
Объявления
14.01.2011, 03:05     Private: static
Ответ Создать тему
Опции темы

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