Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос синтаксиса / 25 сообщений из 36, страница 1 из 2
26.04.2007, 13:08
    #34489483
Вопрос синтаксиса
Сорри, если баян.

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

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

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

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

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

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

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

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

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


Т.е. он ошибся в определении типа переменной.
...
Рейтинг: 0 / 0
26.04.2007, 14:15
    #34489775
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос синтаксиса
Ничего не понимаю, хотел проинициализировать константный указатель на константную строку - получите, какие массивы. Пусть сам появится и даст кусок кода.
...
Рейтинг: 0 / 0
26.04.2007, 14:54
    #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
26.04.2007, 15:11
    #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
26.04.2007, 15:25
    #34490192
Вопрос синтаксиса
Почему всем это кажется странным желанием? :) Неужели не может возникнуть потребность
в массиве строк, который не должен модифицироваться?
А насчет последнего предложенного способа... компилится? студии под рукой нет просто.. Наверно и так можно, но странно, что нет прямого способа, без вспомогательного массива.
Если мы в namespace его объявили, то в составе класса аналогичный ему в принципе-то уже не нужен:)
...
Рейтинг: 0 / 0
26.04.2007, 15:26
    #34490196
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос синтаксиса
ЛюкСкайУокерТак, что-то разьрос понятий:)

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


имхо, это константный указатель на константный массив из элементов char.
...
Рейтинг: 0 / 0
26.04.2007, 15:36
    #34490234
Akh
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
26.04.2007, 15:39
    #34490242
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос синтаксиса
Akh пишет:

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

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

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

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

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

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

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

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

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

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

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

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

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

А вообще, может автор топика поделится, зачем ему такое нужно ?
В чем реальная потребность ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
26.04.2007, 18:04
    #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
26.04.2007, 18:52
    #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
26.04.2007, 20:43
    #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
27.04.2007, 05:29
    #34491468
LisFox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос синтаксиса
ЛюкСкайУокерСорри, если баян.

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

Никак.

М. Эллис, Б. Строуструп
"Справочное руководство по языку программирования С++ с комментариями",
Москва "МИР" 1992,
стр. 289, цитата:
"Нет, ..., синтаксиса для инициализации члена,
являющегося нестатическим константным массивом."
...
Рейтинг: 0 / 0
27.04.2007, 07:23
    #34491510
Вопрос синтаксиса
Если честно, в моем случае потребности в не-static нет (класс все равно singleton:)) Стало интересно, не ожидал что С++ не поддерживает такой синтаксис. Наверно если понадобится в каждом экземпляре свой массив указателей, который не должен модифицироваться, то проще наваять класс массива и агрегировать указатель на константный объект этого класса.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос синтаксиса / 25 сообщений из 36, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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