powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос синтаксиса
36 сообщений из 36, показаны все 2 страниц
Вопрос синтаксиса
    #34489483
Сорри, если баян.

В классе есть
Код: plaintext
1.
const char * const Array[ARRAY_SIZE];
Как его инициализировать? Раз константное поле, значит список инициализации, но массивы он не хавает. Тогда как?
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34489538
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛюкСкайУокерСорри, если баян.

В классе есть
Код: plaintext
1.
const char * const Array[ARRAY_SIZE];
Как его инициализировать? Раз константное поле, значит список инициализации, но массивы он не хавает. Тогда как?

Статиком возможно задать?

И вообще, ты что хочешь сдалать? указатель на массив чаров?
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34489567
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю что так:
Constructor(...) : Array(ptr) { ... }
По другому никак.
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34489646
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛюкСкайУокер пишет:
> const char * const Array[ARRAY_SIZE];
>
> Как его инициализировать? Раз константное поле, значит список
> инициализации, но массивы он не хавает. Тогда как?

В конструкторе, в списке инициализации.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34489689
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blinded, MasterZiv: интересные у вас ответы. :) Автор написал, что у него так не получается, а вы ему говорите, "делай, мол, получится".

Имхо, раз у него не получается, товарищ хочет:

Код: plaintext
1.
const char * const (Array[ARRAY_SIZE]);
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34489721
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что за проблема? Мы указатель в конструктор передать не могем?
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34489743
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedА что за проблема? Мы указатель в конструктор передать не могем?

Он хочет массив схавать. По логике вещей, он хочет инициализировать массив указателей. Я так понял из:

ЛюкСкайУокер
...
Как его инициализировать? Раз константное поле, значит список инициализации, но массивы он не хавает. Тогда как?


Т.е. он ошибся в определении типа переменной.
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34489775
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего не понимаю, хотел проинициализировать константный указатель на константную строку - получите, какие массивы. Пусть сам появится и даст кусок кода.
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34490029
Так, что-то разьрос понятий:)

const char * const Array[ARRAY_SIZE]; - это массив константных указателей на константные строки (хотя мог быть и любой другой тип, не char).

Ну пусть так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class Example
{
    const char * const Array[ARRAY_SIZE];
public:
    Example();    

};

Example::Example() : Array(??????)       //<<< вот где вопрос!!!       
{
}

1. Перечислить в круглых скобках строки мы не можем (синтаксис не позволяет это).
2. В списке инициализации перечислять Array[0] ("Text0"), Array[1]("Text1") - тоже синтаксически нельзя...
Подбросить в скобках другой аналогичный массив, только не-const? Громозко, да и где его взять.
Да, если оформить static-ом будет проще, интересно понять: неужели С++ не позволяет объявить в классе массив константных указателей?! (ясно, что убрав const перед Array в объявлении, проблема решится легко. Ну а если не убирать!)
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34490124
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странное желание. А ежеди так попробовать?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
namespace
{
  const char* const arr[] = 
  {
    "String1",
    "String2",
    "String3"
  };
}
Example::Example() : Array(arr)
{
...
}
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34490192
Почему всем это кажется странным желанием? :) Неужели не может возникнуть потребность
в массиве строк, который не должен модифицироваться?
А насчет последнего предложенного способа... компилится? студии под рукой нет просто.. Наверно и так можно, но странно, что нет прямого способа, без вспомогательного массива.
Если мы в namespace его объявили, то в составе класса аналогичный ему в принципе-то уже не нужен:)
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34490196
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛюкСкайУокерТак, что-то разьрос понятий:)

const char * const Array[ARRAY_SIZE]; - это массив константных указателей на константные строки (хотя мог быть и любой другой тип, не char).


имхо, это константный указатель на константный массив из элементов char.
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34490234
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если это решить через оболочку?

Код: plaintext
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.
class Mass {
        const char * (a[ 2 ]);
    public:
        Mass(char *a1, char *a2) {
            a[ 0 ]=a1;
            a[ 1 ]=a2;
        }
        const char *operator [](int idx) const {
            return a[idx];
        }
        const char *operator [](int idx) {
            return a[idx];
        }
};

class A {
        const Mass mass1;
        Mass mass2;
    public:
        A(char *a1, char *a2) :
        mass1(a1, a2),
        mass2(a1, a2) {}

        void func() {
            printf("%s\n", mass1[ 0 ]);
            printf("%s\n", mass1[ 1 ]);
            printf("%s\n", mass2[ 0 ]);
            printf("%s\n", mass2[ 1 ]);
        }
};

int main() {

    A a("one", "two");

    a.func();

    return  0 ;
};


...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34490242
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh пишет:

> const char * const Array[ARRAY_SIZE]; - это массив константных
> указателей на константные строки (хотя мог быть и любой другой тип, не
> char).

> имхо, это константный указатель на константный массив из элементов char.

Не, именно так, как написал blinded.

Можно еще его в конструкторе поэлементно присвоить. В теле.

На самом деле не понятно, зачем константный нестатический массив в
экземпляре объекта класса. И зачем по значению.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34490335
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Akh пишет:

> const char * const Array[ARRAY_SIZE]; - это массив константных
> указателей на константные строки (хотя мог быть и любой другой тип, не
> char).

> имхо, это константный указатель на константный массив из элементов char.

Не, именно так, как написал blinded.

Можно еще его в конструкторе поэлементно присвоить. В теле.

На самом деле не понятно, зачем константный нестатический массив в
экземпляре объекта класса. И зачем по значению.
Posted via ActualForum NNTP Server 1.4

1. Согласен. Специально проверил. [] приоритетней
2. Нельзя. Указатели константны.
3. Возможно от объекта к объекту данные должны различаться.
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34490631
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛюкСкайУокерПочему всем это кажется странным желанием? :) Неужели не может возникнуть потребность
в массиве строк, который не должен модифицироваться?
..........................

Я считаю что потребность в таком массиве возникнуть не может.
Не понимаю зачем может понадобиться копия неизменяемого массива для каждого объекта класса?
Массив надо просто сделать статическим членом класса и все.
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34490695
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, косяк, студия прямо говорит: «не могу явно инициализировать массивы»
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34490700
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandro_KНе понимаю зачем может понадобиться копия неизменяемого массива для каждого объекта класса?
Массив надо просто сделать статическим членом класса и все.почему копия? Просто неизменяемый массив. Неизменяемым его делают очевидно затем, чтобы его далее нельзя было изменить. Статик не подходит ежу сказали, почему.
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34490710
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh пишет:
> 3. Возможно от объекта к объекту данные должны различаться.
А вот это верно - не подумал.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34490720
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo пишет:
> почему копия? Просто неизменяемый массив. Неизменяемым его делают
> очевидно затем, чтобы его далее нельзя было изменить. Статик не подходит
> ежу сказали, почему.

Но вообще согласен. Можно в объектах сделать ссылки, и их ссылать
на что-то статическое. Которое уже инициализировать.

А вообще, может автор топика поделится, зачем ему такое нужно ?
В чем реальная потребность ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34490808
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
странно, сделал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
int arr1[ 3 ]={ 1 , 2 , 3 };

class Class1
{
  public:
	  int arr[ 3 ];
	  Class1();
};

Class1::Class1(): arr(arr1)
{
}
всё равно не инициализирует
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34490940
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ни хрена мы не знаем. Вот g++ четко сказал
ISO C++ forbids assigment of array
Так что нечего выеживаться, надо делать на все
const char* const* Array;
не не совсем эквивалентно, зато инициализируется без проблем
Хошь так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
namespace
{
  const char* const arr[] = 
  {
    "String1",
    "String2",
    "String3"
  };
}
Example::Example() : Array(arr)
{
...
}

// или так

Example::Example(const char*const arr) : Array(cloneArray(arr)) {}
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34491114
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Со втроенными массивами эта штука не выйдет, а вот написать что-то, что вело бы себя как втроенные массивы можно:

Код: plaintext
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.
template<typename T, size_t N>
struct array
{
	enum {size = N};
	T a[N];
	operator T*() {return a;}
	operator T const *() const {return a;}
};

template<typename T>
array<T,  1 > make_array(T a)
{
	array<T,  1 > tmp = {a};
	return tmp;
}

template<typename T>
array<T,  2 > make_array(T a, T b)
{
	array<T,  2 > tmp = {a, b};
	return tmp;
}

template<typename T>
array<T,  3 > make_array(T a, T b, T c)
{
	array<T,  3 > tmp = {a, b, c};
	return tmp;
}

// ... можно продолжить и дальше эту интересную последовательность :)

class foo
{
	enum {N =  3 };
	array<const char *, N> const arr;
public:
	foo() : arr(make_array<const char *>("1", "2", "3")) {}	
};

int main()
{

	foo f;

	return  0 ;
}
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34491468
LisFox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЛюкСкайУокерСорри, если баян.

В классе есть
Код: plaintext
1.
const char * const Array[ARRAY_SIZE];
Как его инициализировать? Раз константное поле, значит список инициализации, но массивы он не хавает. Тогда как?

Никак.

М. Эллис, Б. Строуструп
"Справочное руководство по языку программирования С++ с комментариями",
Москва "МИР" 1992,
стр. 289, цитата:
"Нет, ..., синтаксиса для инициализации члена,
являющегося нестатическим константным массивом."
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34491510
Если честно, в моем случае потребности в не-static нет (класс все равно singleton:)) Стало интересно, не ожидал что С++ не поддерживает такой синтаксис. Наверно если понадобится в каждом экземпляре свой массив указателей, который не должен модифицироваться, то проще наваять класс массива и агрегировать указатель на константный объект этого класса.
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34492342
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedISO C++ forbids assigment of arrayну про присвоение никто и не говорил, хотели инициализацию. Вот кстати ещё цитатка manIf the entity is of const-qualified type or reference type, or of a (possibly cv-qualified) POD class type (or array thereof) containing (directly or indirectly) a member of a const-qualified type, the program is ill-formed. Интересно, зачем сделали разную семантику инициализации полей объектов и обычных переменных.
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34492368
LisFox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЛюкСкайУокерЕсли честно, в моем случае потребности в не-static нет (класс все равно singleton:)) Стало интересно, не ожидал что С++ не поддерживает такой синтаксис. Наверно если понадобится в каждом экземпляре свой массив указателей, который не должен модифицироваться, то проще наваять класс массива и агрегировать указатель на константный объект этого класса.

Проще - не трогать то, что нельзя! (шутка).

Вообще Строуструп очень часто повторяет одну мысль (в разных вариантах и по разным поводам)
суть которой следующая: при разработке языка С++ исключались те черты, которые могли бы повлечь
дополнительные расходы памяти или времени выполнения. И если посмотреть на машинный код
после компиляции, то действительно нет ничего лишнего, всё компактно и просто.
Я имею в виду компиляторы классического С++, а не всяческие современные IDE, Studio и т. п.

Вот ещё пара цитат из него:

"Язык С++ не пытается ни обеспечить максимально развитого управления защитой,
ни поддержать все мыслимые механизмы для выражения всевозможной защиты.
Такие средства сделали бы язык гораздо более сложным, нежели это есть сейчас,
а он и так обеспечивает весьма высокий уровень выразительности."

"Механизмы управления доступом в С++ обеспечивают защиту от случайного,
а НЕ от преднамеренного доступа. ... Эти возможности относятся к проблемам
окружения и дисциплины программирования, но НЕ к проблемам языка."
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34492553
LisFox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maXmoИнтересно, зачем сделали разную семантику инициализации полей объектов и обычных переменных.

Да просто захотелось :-)

Б. Строуструп
цитата:

Запись =выражение наиболее естественна при инициализации простых переменных, особенно - переменных арифметического типа и указателей.

Запись {список-инициализаций} хорошо служит при инициализации массивов и структур данных.

Запись (список-выражений) кажется наиболее подходящей при создании объекта некоторого типа, который не подходит под стандарты для арифметических типов.

конец цитаты.

Кстати для обычных переменных допустимы все виды присваиваний:
int i = 5;
int i = {5};
int i (5);
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34492927
Наверно "истинно правильно" даже так:
Код: plaintext
1.
int i = int( 5 );
:)
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34493068
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну вообще-то истинно праильно так
int i(5);
все остальное компилер неявно приведет к этому виду
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34493677
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛюкСкайУокер пишет:
> синтаксис. Наверно если понадобится в каждом экземпляре свой массив
> указателей, который не должен модифицироваться, то проще наваять класс
> массива и агрегировать указатель на константный объект этого класса.

Да можно нестатический УКАЗАТЕЛЬ на массив иметь.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34493682
LisFox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЛюкСкайУокерНаверно "истинно правильно" даже так:
Код: plaintext
1.
int i = int( 5 );
:)

Начало этого топика заставило меня разбудить мои мозги,
уже много лет купающиеся в удобной среде визуальной разработки,
где нет и намёка на появление таких крамольных мыслей (это я всё про первый пост).
Но вот этот пост... как бы это помягче...
Неужели учебника даже не читали?
А начало было интересное...
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34494358
Всего не упомнишь.. я знаю много профессиональных программистов, которые с ходу не скажут что такое explicit, volatile или mutable, и прекрасно при этом живут)
А в случае
Код: plaintext
1.
int x = int( 5 )
я просто исходил из того, что для инициализации значением по умолчанию для выбранного типа корректно записать так:
Код: plaintext
1.
int x = int();
Логично же, что здесь мы вызываем конструктор типа int (как бы извращенски это не звучало:))
Ну а первая запись - передача параметров конструктору...
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34494442
LisFox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЛюкСкайУокерВсего не упомнишь.. я знаю много профессиональных программистов, которые с ходу не скажут что такое explicit, volatile или mutable, и прекрасно при этом живут)Согласен. Не хотел обидеть.

ЛюкСкайУокерА в случае
Код: plaintext
1.
int x = int( 5 )
я просто исходил из того, что для инициализации значением по умолчанию для выбранного типа корректно записать так:
Код: plaintext
1.
int x = int();
Логично же, что здесь мы вызываем конструктор типа int (как бы извращенски это не звучало:))
Ну а первая запись - передача параметров конструктору...Да конечно же первая запись имеет право быть написана и поймётся компилятором.
Только получилось "масло масляное".
Сначала создаём объект типа int, инициализированный значением 5, и его присваиваем int'у x.
Вместо того, чтобы сразу создать объект x типа int, инициализированный значением 5.
Код: plaintext
int x ( 5 );

И всё-таки, уважаемый ЛюкСкайУокер , скажите (если не секрет) зачем понадобилось
Код: plaintext
1.
2.
class C {
    const char* const Array [ARRAY_SIZE];
};
А?
Прямо маниакальная боязнь потерять или затереть эти строки...
Опять-таки не обижайтесь! :-)
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34494611
Ну что вы, без обид)
Я уже писал, что мне понадобилась конструкция без константности указателей, а константность строк - действительно для защиты от модификации. Покольку класс по паттерну синглетон, потом я вообще так сделал:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
static const char *PDDSaloonDetailNames[SaloonNumDetails];
...
const char* PDDPlayerGfxProperty::PDDSaloonDetailNames[PDDPlayerGfxProperty::SaloonNumDetails]=
{
	"body",              //имена объектов в салоне
	"signal_left",	
	"signal_right",
......
};
...
Рейтинг: 0 / 0
Вопрос синтаксиса
    #34690888
Akiro_Im
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LisFox
ЛюкСкайУокер
Код: plaintext
1.
int x = int( 5 )
Да конечно же первая запись имеет право быть написана и поймётся компилятором.
Только получилось "масло масляное".
Сначала создаём объект типа int, инициализированный значением 5, и его присваиваем int'у x.
Вместо того, чтобы сразу создать объект x типа int, инициализированный значением 5.
Код: plaintext
int x ( 5 );


Не совсем верно. Не буду искать источник (это есть в стандарте и в книгах Мейерса), напишу сразу по сути... При определении объекта в месте объявления насколько мне известно НИКОГДА не вызыватся оператор присваивания или конструктор копирования.

e.g.
int x = int(5); или
int x (5); или
int x = 5;
АБСОЛЮТНО одно и тоже ( за небольшим исключением в случае наличия explicit конструктора ).
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос синтаксиса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]