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

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

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

Private: static - C++

14.01.2011, 00:47. Просмотров 1568. Ответов 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 ей нельзя присвоить значение. Желательно не использовать дополнительных функций, вообщем не менять класс.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.01.2011, 00:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Private: static (C++):

Наследование классов и обращение к 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++
Добрый вечер, почему приходится подставлять явно ссылку на базовый класс - компилятор скушал - значит знает что внутри класса видно,...

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

7
lemegeton
2928 / 1357 / 136
Регистрация: 29.11.2010
Сообщений: 2,725
14.01.2011, 00:52 #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[]) {
....
0
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
14.01.2011, 00:54 #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;
}
0
Mee
14 / 14 / 1
Регистрация: 05.07.2010
Сообщений: 88
14.01.2011, 01:56  [ТС] #4
Я пробовал этот вариант, выдает ошибку

one or more multiply defined symbols found

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

Добавлено через 42 минуты
если объявить переменную в хедере, а потом подключить этот хедер в нескольких местах(у меня реализация и мейн в разных файлах), то выходит конфликт
0
lemegeton
2928 / 1357 / 136
Регистрация: 29.11.2010
Сообщений: 2,725
14.01.2011, 02:07 #5
Эээ, батенька, вы забыли в хидере защиту от множественных включений.
(Хрустальный шар показал)
0
Mee
14 / 14 / 1
Регистрация: 05.07.2010
Сообщений: 88
14.01.2011, 02:20  [ТС] #6
Цитата Сообщение от lemegeton Посмотреть сообщение
Эээ, батенька, вы забыли в хидере защиту от множественных включений.
(Хрустальный шар показал)
Если вы говорите о #pragma once, то оно у меня есть
0
lemegeton
2928 / 1357 / 136
Регистрация: 29.11.2010
Сообщений: 2,725
14.01.2011, 02:24 #7
Значит не работает/показывайте код.
0
Mr.X
Эксперт С++
3053 / 1698 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
14.01.2011, 03:05 #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()};
}
0
14.01.2011, 03:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2011, 03:05
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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