Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
12 / 12 / 2
Регистрация: 05.06.2016
Сообщений: 248

Область видимости класса для массива

25.12.2017, 03:12. Показов 1590. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не пойму, почему в данном примере (и вообще) нельзя использовать переменную "n" для создания массива "x"? Для всех остальных случаев в классе ведь не мешает то того что "n" объявлена ниже его использования, не вижу разницы.
C++
1
2
3
4
5
6
7
8
9
10
11
12
class X {
    int f(int a = n) { // X::n is in scope inside default parameter
         return a*n;   // X::n is in scope inside function body
    }
    int g();
    int i = n*2;   // X::n is in scope inside initializer
 
//  int x[n];      // Error: n is not in scope in class body
    static const int n = 1;
    int x[n];      // OK: n is now in scope in class body
};
int X::g() { return n; } // X::n is in scope in out-of-class member function body
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.12.2017, 03:12
Ответы с готовыми решениями:

область видимости класса
А почему у меня ошибку выдает? Не могу понять using namespace std; class Base { int a; public: Base(int aa) { a = aa; } ...

Область видимости переменной пользовательского класса
Всем привет! Столкнулся с такой проблемой: Создал клас и в нем класс исключений class A { char* pt; public: class...

Область видимости и время жизни переменных внутри класса
Есть класс, определение в файле myclass.h, реализация myclass.cpp Как и где правильно определить глобальную переменную, чтоб ее значение...

9
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
25.12.2017, 04:38
круть! не знал
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
25.12.2017, 09:55
Цитата Сообщение от nammidd Посмотреть сообщение
Не пойму, почему в данном примере (и вообще) нельзя использовать переменную "n" для создания массива "x"?
Именно переменную, а не константу?
1) Стандарт пишут ленивые задницы, которые никак не перетащат из Си flexible array member и variable lenght array. Поэтому, строго говоря задавать размер массива переменной вообще нельзя. А если вдруг можно, то это частное расширение компилятора (хотя, популярные gcc и Студия его поддерживают).
2) Даже если и перетащат, чтобы запихнуть VLA внутрь структуры, его придется инициализировать в конструкторе. А конструкторов то в Си и нету. Поэтому, никаких VLA, только flexible array member, только хардкор.
3) flexible array member - int x[]. Да, именно так, с пустым размером и строго в конце структуры.
0
71 / 59 / 14
Регистрация: 20.12.2013
Сообщений: 732
25.12.2017, 10:35
Не знаю как там что выделяется,но, в принципе, для использования n в выражениях не нужно знать значение при компиляции - только тип, а вот для выделения памяти под массив нужно знать значение, так что логика есть.
0
12 / 12 / 2
Регистрация: 05.06.2016
Сообщений: 248
25.12.2017, 13:19  [ТС]
Renji, я про константу имел ввиду, у меня обычный массив с константным количеством элементов, а не flexible array member и variable lenght array, почему массивы я должен создавать в конце структуры? Почему они не видят объявления обяъвленные ниже них?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
25.12.2017, 13:23
Цитата Сообщение от nammidd Посмотреть сообщение
Почему они не видят объявления обяъвленные ниже них?
А, понятно. Не видит потому что разработчики языка когда-то решили что любая переменная/функция/тип должны быть объявлены до первого использования.
Тела же методов компилируются так, как если бы вы эти тела описали после объявления класса. Соответственно, им пофиг в какой последовательности константы объявлены.
0
12 / 12 / 2
Регистрация: 05.06.2016
Сообщений: 248
25.12.2017, 15:44  [ТС]
Renji,
Цитата Сообщение от Renji Посмотреть сообщение
любая переменная/функция/тип должны быть объявлены до первого использования
В классах область видимости имени распространяется на всё тело класса. В моём примере из первого сообщения это видно (строки 2, 3, 6, использование константы "n" которая объявлена в строке 9), только мой вопрос в том почему это не работает для массива.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
25.12.2017, 18:59
Цитата Сообщение от Renji Посмотреть сообщение
1) Стандарт пишут ленивые задницы, которые никак не перетащат из Си flexible array member и variable lenght array.
зачем в С++ variable length array? Может вообще сборщик мусора и произвольную типизацию из Питона позаимствуем?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
25.12.2017, 21:11
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
зачем в С++ variable length array?
Зачем в C++ быстрое выделение памяти под массивы? Может, еще попробуем программу на микроконтроллере запустить? Если вектор долго выделяет память в хипе, купи наконец 32 ядерный процессор, нищеброд!

Память под VLA массивы выделяется из стека, то есть практически мгновенно. И VLA расходует стек экономней чем "а ты выдели буффер на десять тысяч элементов и используй потом первые десять". Затем оно и нужно.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
25.12.2017, 23:24
nammidd, я думаю, что причина в том, что статические константы в классе могут создаваться позже чем сами классы/типы. Вот пример с простым шаблоном использующим константу. Он тоже не создаётся если нет объявления в области видимости. Я не имею ввиду область класса в общем случае. Классы создаются раньше функций и компилятор может требовать полной определённости для создания типа. Иначе созданный тип может быть использован там где ожидается определение (ниже - как Вы ожидаете) и получится циклическая зависимость или попросту неопределённость.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
struct scope_or_not_scope{
    template
<const int a>
struct Constanta{
    int foo(){return a;}
    };
 
//Constanta<constanta> m_constanta;//c:\users\...\documents\visual studio 2008\....cpp(39951) : error C2065: constanta: необъявленный идентификатор
static const int constanta = 123;
Constanta<constanta> m_constanta;//а тут всё есть
};
 
int main(int argc, char* argv[])
{
scope_or_not_scope sc;
cout<<sc.m_constanta.foo()<<endl;
system("pause");
return 0;
}
Как это может быть связано с массивами? Просто. Массив это не тип а встроенный шаблон. То есть int a[] это не тип, а int a[3] и int b[4] это типы. Причём два разных типа. Они являются инстансами шаблона массива на типе int с размерами 3 и 4 соответственно. То есть, нельзя создавать типы откладывая такие вопросы как размер (и др.).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.12.2017, 23:24
Помогаю со студенческими работами здесь

Область видимости переменной. 3 цикла. Выводим содержимое массива
int main(прошу меня проверить) { Доброго дня, коллеги! Вот сижу с темой - область видимости переменной, нацарапал такое...

Обнуление переменных класса - это область видимости?
В основной модуль подключается юнит с определенными функциями (в роли библиотеки). Так же подключается модуль с самодельными...

Область видимости общей переменной для потоков + закрытие потоков
Есть два вопроса про потоки. Первый. Как можно сделать общую переменную для основного потока и моих ? struct ThreadInfo1 { int...

Задать область видимости массива для всех модулей
Здравствуйте! Скажите пожалуйста: Sub zx() Dim a(10, 10) As Byte 'процедура........ End Sub В процессе работы вышеуказанной...

Область видимости класса
Пример 1 var_dump(class_exists(&quot;TestClass&quot;)); //true class TestClass { function __construct() { ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru