Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.85/40: Рейтинг темы: голосов - 40, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 29.02.2020
Сообщений: 39

Что будет если добавить элемент в кольцевой буфер n+1 больший, чем размер буфера?

27.05.2020, 05:47. Показов 8446. Ответов 77

Студворк — интернет-сервис помощи студентам
Что будет если добавить элемент в кольцевой буфер n+1 больший, чем размер буфера?


Кольцевой буфер емкостью 1024 вещественных числа. Доступ к
элементам буфера – как к элементам очереди. Обязательны функции-члены
класса для инициализации буфера, добавления/удаления элемента, определения
количества свободного/занятого пространства в буфере.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
using namespace std;
#include<iostream> 
class CircularBuffer {
private:
    int* _data;          // Хранимые данные.
    int     _size;          // Размер циклического буффера.
    int     _freeSpace;     // Свободное метос в буффере.
    int     _occupiedSpace; // Занятое мето.
 
public:
    CircularBuffer();
    ~CircularBuffer();
 
    // Метод, возвращающий свободное место.
    int GetFreeSpace() { return _size - _occupiedSpace; }
 
    // Метод, возвращающий занятое место.
    int GetOccupiedSpace() { return _occupiedSpace; }
 
    // Метод добавления элемента в буффер.
    void Add(int val);
 
    // Метод достающий элемент из очереди (с последующим его выталкиванием).
    int Get();
};
 
int main(int argc, char** argv)
{
    // Создаем экземпляр класса.
    CircularBuffer c;
    int count = 10;
 
    // Заполним очередь от 1 до 10 с выводом текущего стояния буффера.
    for (int i = 1; i <= count; ++i) {
        c.Add(i);
        cout << "Fress space: " << c.GetFreeSpace() << "; Occupied: " << c.GetOccupiedSpace() << endl;
    }
 
    // Очистим очередь от 1 до 10 с выводом текущего стояния буффера.
    for (int i = 0; i < count; ++i) {
        cout << "Get next: " << c.Get() << endl;
        cout << "Fress space: " << c.GetFreeSpace() << "; Occupied: " << c.GetOccupiedSpace() << endl;
    }
 
    return 0;
}
 
CircularBuffer::CircularBuffer()
{
    // Инициализация мета под буффер.
    _size = 1024;
    _data = new int[_size];
    // Сборс внутреннего состояния всех полей.
    _freeSpace = _size;
    _occupiedSpace = 0;
}
 
CircularBuffer::~CircularBuffer()
{
    delete[] _data;
} // Не забываем осободить выделенную в конструкторе память.
 
void CircularBuffer::Add(int val)
{
    _data[_occupiedSpace++ % _size] = val;
}  // Устанавивливаем соотв. элемент согласно правилу заполнения циклического буффера.
 
int CircularBuffer::Get()
{
    // Проверка на пустоту буффера.
    if (_occupiedSpace == 0)
        throw "Buffer is empty";    // Борсаем исключение, в случае попытки вытолкнуть из пустой очереди.
 
    int res = _data[0]; // Запоминаем первостоящего в очереди.
    // Сдвигаем очередь на одну позицию вперед.
    for (int i = 1; i < _occupiedSpace; ++i)
        _data[i - 1] = _data[i];
    // Корректируем размер.
    --_occupiedSpace;
    return res; // Возвращаем первый элемент.
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.05.2020, 05:47
Ответы с готовыми решениями:

Почему GetTokenInformation возвращает буфер больший, чем затребованная структура?
Здравствуйте! Помогите, пожалуйста, понять. Беру GetTokenInformation. Затребую тип инфы - TokenUser. Функция говорит, что нужен...

Что будет если в размер массива отправить 0?
Что будет если создать динамический массив int SIDE; int *arr = new int; И ввести SIDE = 0, то что происходит? Объясните...

Что будет иметь больший вес для ПС
в футере на главной странице решил поставить пару ключей. Как лучше оформить их? как ссылку на эту же страницу или как &lt;h4&gt;

77
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
06.05.2021, 16:48
Студворк — интернет-сервис помощи студентам

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
Это одно и то же.
да нет я знаю что это одно и тоже это я к примеру написал... просто в английском только один термен преимущественно... в русском каждый автор извращяется как может... и когда ты новичок каждое новое название новый ступор. Я к тому что для вас это яйца выеденного не стоит а для новичка только изза терминологии порой бывает ступор :)... ветееват пушкинский язык ох ветееват



Цитата Сообщение от DrOffset Посмотреть сообщение
Да все потому же. Статик - это свойство типа.
вот честно. ну и что что статик свойство типа... я так ветеевато не умею - статик это свойство члена быть общим (и без объекта) для всех объектов. Понятно что Ringbuffer<int, 16> маска у него другая. другая значит что маска у каждого своя. значит не общая. а статик нам говорит что она должна быть общая. как объяснить два противополжных значения ?

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
с явно указанным инициализатором тем не менее не являлось определением
а в чём разница ? почему const static int i = 10; (это объявление я так понимаю) не тоже самое что объявление вне класса int Class::i{10}; (это определение я так понимаю) ?

https://create.arduino.cc/edit... 6f/preview
строчка 65 что означает , ну я имею ввиду после добовления USART() стало компилироваться, но что за процессы скрываются под таким вызовом ?

строчка 119 означает что когда мы создадим объект класса USART<> serial то массив serial.rx_buffer[] будет не пустой ? /в 119 строчке идёт запись в массив по прерыванию. ну как минимум так планировалось/
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
06.05.2021, 22:24
Цитата Сообщение от alexbmd Посмотреть сообщение
ну и что что статик свойство типа... я так ветеевато не умею - статик это свойство члена быть общим (и без объекта) для всех объектов.
Для всех объектов ДАННОГО ТИПА. Новый тип - новый экземпляр static-переменной.
Объект вообще не нужен для понимания концепции static. Отталкиваться нужно от типа (в 4й раз уже говорю). Думайте.

Вот подставили вы аргументы в свой шаблон - это привело к генерации нового типа. И мгновенно с этим возникла новая static-переменная. Всё, не нужны никакие объекты. Их может вообще не быть.

Вы не понимаете что такое шаблон, или что? Не ясно в чем у вас затруднение. Вроде простые слова говорю. Никакой витиеватости нет.

Добавлено через 2 минуты

Не по теме:

Цитата Сообщение от alexbmd Посмотреть сообщение
ветееват пушкинский язык ох ветееват
"Витиеват". Неужели вам хотя бы браузер ошибки не подчеркивает? Ну правда, нельзя же взрослому человеку такие ошибки делать.

0
 Аватар для stdin
129 / 81 / 49
Регистрация: 10.01.2020
Сообщений: 293
06.05.2021, 22:26
неплохо
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
06.05.2021, 22:27
Цитата Сообщение от alexbmd Посмотреть сообщение
как объяснить два противополжных значения ?
Вы придумали сами эту противоположность.
А на самом деле ее нет.

Ringbuffer<int, 16> и Ringbuffer<int, 32> - это два разных типа. И static-переменные у них будут разные. Все объекты каждого из этих типов получат свою общую static-переменную.
Все-таки вы определенно не понимаете что такое шаблон и видимо считаете параметры в угловых скобках каким-то видом инициализации данных в классе.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
06.05.2021, 22:27
Цитата Сообщение от alexbmd Посмотреть сообщение
а в чём разница ? почему const static int i = 10;(это объявление я так понимаю) не тоже самое что объявление вне класса int Class::i{10}; (это определение я так понимаю) ?
Потому что так написано в стандарте языка. Такой синтаксис в таком-то месте означает одно, а другой синтаксис в другом месте означает другое.

А как заходит речь о статических членах шаблонного класса, то набор синтаксисов становится еще шире.
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
07.05.2021, 11:13
Цитата Сообщение от DrOffset Посмотреть сообщение
Новый тип - новый экземпляр static-переменной.
ааа вот теперь понял извините пока шаблон (или как вы говорите тип) один то все копии класса (ну объекты) будут использовать один(и общий) статик член..

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
то набор синтаксисов становится еще шире.
ох и не говорите. так результат же одинаков будет в двух случаях выше i=10 значит можем писать как нам больше нравиться ? или есть случаи когда один из вариантов нельзя использовать?

а строчки 65 и 119 объясните пожалуйста ?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
07.05.2021, 14:02
Цитата Сообщение от alexbmd Посмотреть сообщение
65
У временного объекта типа USART (про подобный синтаксис вы уже спрашивали тут) вызывается метод buffer_write. Будет создан объект типа USART(1) с инициализацией по умолчанию, время жизни которого длится до конца выражения, у этого объекта вызывается метод buffer_write.
__________________
(1) Имя USART внутри шаблонного класса означает тип с подставленными "текущими" параметрами шаблона. Т.е., например, для варианта инстанцирования USART<> (USART<uint8_t, 16>) имя USART внутри шаблонного класса это "псевдоним" для USART<uint8_t, 16>. Для варианта инстанцирования USART<uint8_t, 32> имя USART внутри шаблонного класса это "псевдоним" для USART<uint8_t, 32>.

Цитата Сообщение от alexbmd Посмотреть сообщение
119
Это вызов статической функции используя ее квалифицированное имя (с указанием типа, которому она принадлежит). В данном случае типа USART<> (USART<uint8_t, 16>).
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
07.05.2021, 16:48
DrOffset, да спасибо понял.. вообщем бесполезные вызовы ... в одном случае потому что временный и вызов этого временного равен нулю, в другом - иззатого что статические .. и кроме статических братьев они ничего не видят... а городить static T StaticFn(Class& example) чтобы добраться до других нон-статик методов похоже избыточно
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
07.05.2021, 19:06
Цитата Сообщение от alexbmd Посмотреть сообщение
вызов этого временного равен нулю
Да почему ж нулю-то?

Я же писал выше:
Цитата Сообщение от DrOffset Посмотреть сообщение
Я говорю о том, что значение по умолчанию - причина, а ноль в частном случае для int - следствие. Например, если DATA_T будет std::string, то DATA_T() приведет к созданию объекта с пустой строкой, а никак не нуля. Так что нет, мы с вами о разном говорим.
USART() приведет к созданию объекта типа USART со значением по умолчанию. Значение по умолчанию для этого типа задается конструктором по умолчанию. В том коде он реализован с помощью метода begin(). Вот и смотрите что делает begin(), чтобы понять что происходит во время USART().

Цитата Сообщение от alexbmd Посмотреть сообщение
в другом - иззатого что статические .. и кроме статических братьев они ничего не видят...
Да нет же. Они и "видят" все и доступ имеют ко всему, что есть в классе. Потому что все, что есть в классе - это часть его типа. А я уже вам выше 50 раз сказал, что static - это свойство типа. Только в данном случае доступ осуществляется через временный объект.

На самом деле было бы нагляднее, если бы метод buffer_write был приватным. Это показало бы и возможности доступа и большую целесообразность статической функции в том коде.

Кликните здесь для просмотра всего текста

https://rextester.com/YJBCFR93884
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
class A
{
public:
    static void static_foo() 
    {
        // т.к. функция статическая, она "видит" и имеет доступ ко всему, что есть в классе
        std::cout << A().value;  
        // A() создает временный объект и инициализирует его поле value значением 42
    }
    
private:
    int value = 42;
};
 
 
int main()
{
    A::static_foo();
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
08.05.2021, 02:08
Цитата Сообщение от alexbmd Посмотреть сообщение
ох и не говорите. так результат же одинаков будет в двух случаях выше i=10 значит можем писать как нам больше нравиться ? или есть случаи когда один из вариантов нельзя использовать?
Не понимаю вопроса. Что именно имеется в виду под "результатом"? "Результат" тут весьма обширен и многогранен.

1. Если инициализатор указан в объявлении static поля, т.е. прямо в классе, то он обычно будет располагаться в заголовочном файле. Для static const полей класса это означает, что их инициализатор будет виден во всех единицах трансляции. И во всех единицах трансляции оптимизатор будет иметь возможность подставлять фактическое значение инициализатора, вместо полноценного обращения к содержимому в памяти. Для целочисленных static const полей это будет означать, что они будут являться integral constant expressions - ради этого для них и было сделано такое исключение в С++98.

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

2. Для многих использований константных значений на стадии компиляции определение вообще не требуется. То есть выделения памяти вообще не требуется. Достаточно лишь объявления с инициализатором. А компилятор просто подставит везде где нужно правильное значение.

3. Расположение определения объекта со статическим классом памяти влияет на момент его инициализации в общем порядке инициализации. Вполне может быть, что вам в вашем случае это важно. Значит придется делать отдельное определение и указывать инициализатор именно там.
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
08.05.2021, 10:34
Цитата Сообщение от DrOffset Посмотреть сообщение
Да почему ж нулю-то?
ну я имею ввиду что вызов внутри статика через USART().nonStaticBufferWrite(c)... а потом через USART<> serial; serial.ReadBuffer()... так вот readbuffer не видит изменения сделанные временым объектом...

ааааа если вы про ноль как про чёткое математическое явление... да но наверно не нулю.. ноль я на человеческом языке имел ввиду нет полезного результата который можно использовать

"Значение по умолчанию для этого типа задается конструктором по умолчанию." ато есть оно вот прямо с нуля создается.. тогда точно не нужно мне , спасибо. блин сколько тонкостей у каждой запятой, кавычки...

Цитата Сообщение от DrOffset Посмотреть сообщение
Они и "видят" все и доступ имеют ко всему
ну как в вашем примере да. а что бы static_foo() не печатала а изменяла переменную, а другая non_static_foo() печатала её ? у меня получилось только на печать выводить не измененое значение

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что именно имеется в виду под "результатом"?
результат присвоения. у меня в обоих случаях присваивает успешно. а значит (не вдаваясь в подробности внутреней конструкции) обе записи равноцены. но из вашего объясненияя вижу что всётаки какаято там глубокая разница есть. в сложных проектах так точно.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
в определении static поля где-то глубоко в дебрях некоей единицы трансляции
что значит единица трансляции ? и как это глубоко . у нас же или идёт внутри класса сразу . либо внутри только объявление а сразу за классом начинаем инициализацию методов,переменных
C++
1
2
3
4
5
class A{
int i;
int foo();
};
int A::i{10}; int A::foo(){return i;}
Добавлено через 34 минуты
а такой еще вопрос , ни как не могу понять
можем мы объъявлять ниже следующие функции как const
C++
1
2
3
4
5
6
7
    inline uint8_t buffer_count() const {
      return (rx_head - rx_tail) & rx_mask;
    }
 
    inline void flush() const {
      rx_tail = rx_head;
    }
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
08.05.2021, 10:37
Цитата Сообщение от alexbmd Посмотреть сообщение
ну как в вашем примере да. а что бы static_foo() не печатала а изменяла переменную, а другая non_static_foo() печатала её ?
Вы не на то смотрите. Там надо внимание обращать на сам факт наличия доступа к приватному полю. Пример об этом.

Цитата Сообщение от alexbmd Посмотреть сообщение
что бы static_foo() не печатала а изменяла переменную, а другая non_static_foo() печатала её ?
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
 
class A
{
public:
    static void static_foo() 
    {
        A obj;
        
        obj.value = 12;
        
        obj.non_static_foo();
    }
    
private:
    void non_static_foo() {
        std::cout << value;     
    }
    
    int value = 42;
};
 
 
int main()
{
    A::static_foo();
}
и опять же, пример не том, что static заменяет не-static, а том, что доступ (т.е. access) к данным функция может получить, потому что принадлежит классу.


Цитата Сообщение от alexbmd Посмотреть сообщение
что значит единица трансляции ?
Единица трансляции

Добавлено через 1 минуту
Цитата Сообщение от alexbmd Посмотреть сообщение
можем мы объъявлять ниже следующие функции как const
buffer_count - можем.
flush - не можем (она изменяет состояние класса потому что).
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
08.05.2021, 17:39
Цитата Сообщение от alexbmd Посмотреть сообщение
а сразу за классом начинаем инициализацию методов,переменных
Это как это? Если вы будете размещать определения статических членов класса в заголовочном файле сразу за классом, то такие определения тут же приведут к классической ошибке множественного определения от линкера.

Нет, мы не "начинаем инициализацию методов (?),переменных" сразу за классом. Описание класса располагается в заголовочном файле, а определения методов и статических переменных располагается в файле реализации, т.е. совсем в другом файле.
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
10.05.2021, 11:17
Цитата Сообщение от DrOffset Посмотреть сообщение
на сам факт наличия доступа к приватному полю.
а разве с этим какието проблемы? вроде любой член данного класса имеет доступ ко всем членам. а если вы про доступ статика к нон статику так это только для чтения. (ваш пример немного не то) я имел ввиду чтото типо
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
 
class A
{
public:
    static void static_foo() {
        A obj;
        obj.value = 12;
    }
    
    void foo() {
        non_static_foo();
    }
    
private:
    void non_static_foo() {
        std::cout << value;     
    }
    
    int value = 42;
};
 
 
int main() {
    A instance;
    A::static_foo();
    instance.foo();
}


Цитата Сообщение от DrOffset Посмотреть сообщение
она изменяет состояние класса потому что
а зачем вообще функции константы ? зачем нам их так объявлять ? если есть переменные константы.

TheCalligrapher, я имел ввиду при написании без заголовочного файла
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
10.05.2021, 12:51
Цитата Сообщение от alexbmd Посмотреть сообщение
а разве с этим какието проблемы?
Проблемы с пониманием у вас базовых концепций Я вам их иллюстрирую.

Цитата Сообщение от alexbmd Посмотреть сообщение
а если вы про доступ статика к нон статику так это только для чтения
Что значит "только для чтения"? static имеет доступ ко всем членам класса; вы сами это сейчас сказали и я выше сразу говорил об этом. Конкретный объект указанного класса, на котором эти свойства доступа будут видны, естественно должен быть один и тот же, чтобы говорить о non-static полях. У меня в примере это один и тот же объект, и, соответственно, один и те же данные, и на чтение и на запись.

Цитата Сообщение от alexbmd Посмотреть сообщение
я имел ввиду чтото типо
Так в вашем примере два разных объекта!
У слова "доступ" вполне четкое значение в рамках С++. Я вам выше специально дал ссылку. Изучайте.

Еще у меня сложилось впечатление, что вы постоянно путаете тип(класс) и объект. Когда читаете мои посты, у вас смешивается все в кучу и вы в итоге не понимаете о чем идет речь. Давайте вы сейчас акцентируете на этом внимание и прям перечитаете всю тему сначала. А то без этого похоже разговор продолжать нет смысла, ибо воду в ступе толчем.

Цитата Сообщение от alexbmd Посмотреть сообщение
а зачем вообще функции константы ? зачем нам их так объявлять ?
Чтобы подчеркнуть, что они не меняют состояние объекта. А дать компилятору возможность проверить инварианты с этим связанные. Тут мы внезапно возвращаемся к уже сказанному:
Цитата Сообщение от DrOffset Посмотреть сообщение
Когда программист пишет программу он решает две задачи:
1) Сделать так, чтобы программа решала то, что требуется
2) Написать код так, чтобы его можно было прочитать и качественно понять (далее я буду использовать для этого термин "выразительность")
1
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
11.05.2021, 12:17
Цитата Сообщение от DrOffset Посмотреть сообщение
Проблемы с пониманием у вас базовых концепций
скорее с Си-Иделогии

нет я понимаю что такое объект. я веду к тому что в основном мы как работаем с классом. делаем объект-экземпляр и работаем. то что вы внутри создали новый-другой объект это ни что иное как временный объект. ведь мы не можем внутри статика создать такойже объект как в main ? я говорю создать а не передать как аргумент. так вот вроде не можем насколько я знаю. и получается что в моих простых задачах такие витиеватые алгоритмы через создание временных объектов избыточны. тем более что результатом от этого временного объекта нельзя воспользоваться в основном объекте.
я вообще даже пока и представить не могу что за задача должна быть чтобы нам нужно изменять какието члены только через временный объект внутри статика! понятно что в больших и сложных задачах возможно там сплошь и рядом используются такие методы но мне пока оно как собаке пятая нога.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
а определения методов и статических переменных располагается в файле реализации
хорошо если говорить по классике
зачем нам проводить реализацию например статичной переменной i в другом файле. что нам мешает сразу в заголовочном её определить внутри описания (как я показывал выше)? почему лвиное большинство предпочитает это делать не в заголовочном , просто потумочто так красиво ? или все просто повторяют как делают большинство ? или другие причины?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
11.05.2021, 12:49
Цитата Сообщение от alexbmd Посмотреть сообщение
ведь мы не можем внутри статика создать такойже объект как в main ?
Можем. Я же выше показывал.
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
12.05.2021, 09:01
Цитата Сообщение от alexbmd Посмотреть сообщение
зачем нам проводить реализацию например статичной переменной i в другом файле
вообще литература говорит разницы нету это дело симантики и вкуса. проще для восприятия константы и прочие важные переменные инициализировать в заголовке а сами громоздкие методы в основном файле чтоб потом не перекомпилировывать каждый раз заголовочный

Цитата Сообщение от DrOffset Посмотреть сообщение
Можем.
очевидно вы в это вкладываете что он такого же типа - класса. но пост 54 я показал что я имею ввиду. вы говорите этой другой объект. а как создать такой же объект в main чтоб он видел те изменения которые делаетвременый объект в статике ?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
12.05.2021, 09:18
Цитата Сообщение от alexbmd Посмотреть сообщение
но пост 54 я показал что я имею ввиду. вы говорите этой другой объект. а как создать такой же объект в main чтоб он видел те изменения которые делаетвременый объект в статике ?
Елки-палки, ну вот верно же я сказал. Вы не видите разницы между классом и объектом.
В вашем посте #54 у вас ДВА разных объекта, и по барабану где они находятся, суть от этого не изменится.
Если у вас два разных объекта, то один объект изменения другого никак не увидит, хоть "в статике", хоть "не в статике".

Если вам нужно, чтобы объект был создан в static-функции, а продолжил меняться в main, то и делайте это. Например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
 
class A
{
public:
    static A static_foo() {
        A obj;
        obj.value = 12;
        return obj;
    }
    
    void foo() {
        non_static_foo();
    }
    
private:
    void non_static_foo() {
        std::cout << value;     
    }
    
    int value = 42;
};
 
 
int main() {
    A instance = A::static_foo();
    instance.foo();
}
При этом все эти манипуляции вообще не имеют никакого отношения к тому, что я говорил.
Грубо говоря, я вам объяснял характеристики гвоздей, а вы спрашиваете про то как покрыть крышу.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
12.05.2021, 09:43
Цитата Сообщение от alexbmd Посмотреть сообщение
хорошо если говорить по классике
зачем нам проводить реализацию например статичной переменной i в другом файле.
Потому что определение не-inline статического поля должно быть единственным на всю программу. Если вы его не вынесете в файл реализации, а поставите прямо после класса в заголовочном файле, то ваша программа не будет компилироваться из-за множественного определения при множественном включении заголовочного файла.

Цитата Сообщение от alexbmd Посмотреть сообщение
что нам мешает сразу в заголовочном её определить внутри описания (как я показывал выше)?
(Что такое "внутри описания"? Внутри описания чего? Класса?)

Язык С++ мешает. В языке С++ (до появления inline переменных) вообще не существует способа определить статический член класса "внутри описания". Это невозможно в принципе. Поэтому о каком "как я показывал выше" вы ведете речь мне не ясно. Ничего вы "выше" показывать не могли.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.05.2021, 09:43

Если исходный файл имеет размер больший или равный 10 - выбрать из него только первые 10 элементов
№1 Дан файл целых чисел. Создать на его основе новый файл, размером в 10 элементов. Если исходный файл имеет размер больший или равный 10 -...

Сокет принял данных больше, чем размер буфера
Этот вопрос скорее всего относиться не к php. Но так как другого раздела я не нашел, а сервер и клиент написаны на php, то задам здесь. ...

Сокет принял данных больше, чем размер буфера
Простой клиент посылает 100 байт. Сервер просто принимает соединение и больше ничего не делает (данные не считывает, уходит в таймаут). У...

Php+mysql что будет если запрос SELECT выполнится быстрее чем UPDATE (в разных потоках)
Ребята. Вот объясните мне пожалуйста. Может ли быть такое?: Предположим, что открылось 2 потока одновременно (2 юзера открыли...

Чем больше размер буфера, тем быстрее программа обрабатывает файл?
Друзья, подскажите, на официальном сайте: =Вот тут docs.embarcadero.com= Первый вопрос: В коде: F, FTwo: System.TextFile; // Почему...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
Сукцессия 20. Война автоботов. Делаем ставки. Лёд против "пш-пш!".
anaschu 11.07.2026
Битва ИИ в ризосфере: Как мы скрестили жесткие ОДУ, закон Фика и «подземный шантаж» Уважаемые коллеги! Хочу поделиться уникальным опытом ведения междисциплинарной компьютерной разработки. Прямо. . .
Сукцессия 19. Какие выводы я сделал из модели? Часть 2.Внутримикоризный стехиометрический буфер и хроно-дискретные зоны экспансии
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования
Сукцессия 18. Какие выводы я сделал из войны грибов с деревьями? Часть 1- рассказ и немного про термины
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования Система ОДУ описывает динамику изменения массы различных компонентов системы во времени. Ключевой. . .
Просветление в 5 секунд
kumehtar 10.07.2026
Андрей Веретенников выдал фразу недавно: "Вам не обязательно кем-то себя считать"
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru