Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Структура в классе, присвоение, приведение типов 
V
    Опции темы
SolRus
  Дата 13.8.2011, 06:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 6.8.2011

Репутация: нет
Всего: нет



Код

class my_class
{
private:
    struct a {
        short a1; 
        short a2;
    } b;
public:
    my_class(void);
};

my_class::my_class(void) {
    a s = {70,100};  b = s;
}
почему vc 2010 express выдаёт ошибку в конструкторе при таком виде? b = {70,100}; 
при наведении подсказка показывает error: требуется выражение, а при компиляции пишет  smile :
Цитата

error C2059: синтаксическая ошибка: {
error C2143: синтаксическая ошибка: отсутствие ";" перед "{"
error C2143: синтаксическая ошибка: отсутствие ";" перед "}"

итак почему напрямую неудается присвоить? что то до меня никак не дойдет :(
как следствие приходится делать именованую структуру (а)

Вопрос два. дополнительный ;)
и еще подскажите как присвоить b = 0x00640046; без ипользования доп. переменных, т.е. чтоб сразу одним оператором
Код
long *v = (long*) &b;
*v = 0x00640046;
как бы работает, но опять же... как  напрямую то присвоить?
 smile 

Это сообщение отредактировал(а) SolRus - 13.8.2011, 07:21
PM MAIL Skype   Вверх
asmdzen
Дата 13.8.2011, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



Цитата(SolRus @  13.8.2011,  06:14 Найти цитируемый пост)
my_class::my_class(void) {
    a s = {70,100};  b = s;
}

нужно писать так:
Код

my_class::my_class(void) : b{70, 100}{}

все что после ':' называется "списком инициализации"
Цитата(SolRus @  13.8.2011,  06:14 Найти цитируемый пост)
как присвоить b = 0x00640046;


Код

*(long*) &b = 0x00640046;




Это сообщение отредактировал(а) asmdzen - 13.8.2011, 08:28
PM MAIL   Вверх
SolRus
  Дата 13.8.2011, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 6.8.2011

Репутация: нет
Всего: нет



Цитата(asmdzen @ 13.8.2011,  08:27)

нужно писать так:
Код

my_class::my_class(void) : b{70, 100}{}

все что после ':' называется "списком инициализации"

 не работает smile подчеркивает - my_class::my_class(void) : b{70, 100} {} пишет:
Цитата

error C2059: синтаксическая ошибка: {
error C2143: синтаксическая ошибка: отсутствие ";" перед "}"
error C2447: {: отсутствует заголовок функции (возможно, используется формальный список старого типа)

 smile 
PM MAIL Skype   Вверх
borisbn
Дата 13.8.2011, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



SolRus, студия ещё не доросла до списков инициализации, поэтому в студии можно только так
Код

class my_class
{
private:
    struct a {
        short a1; 
        short a2;
    } b;
public:
    my_class(void);
};

my_class::my_class()
{
    b.a1 = 70;
    b.a2 = 100;
}



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
SolRus
  Дата 13.8.2011, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 6.8.2011

Репутация: нет
Всего: нет



Цитата(borisbn @ 13.8.2011,  20:53)
SolRus, студия ещё не доросла до списков инициализации, поэтому в студии можно только так
1. уверен? или ты про структуры что нелья использовать? вот пример инта в списке инициализаторов:
Код

class my_class
{
private:
    int k;
    struct a {
        short a1; 
        short a2;
    } b;
public:
    my_class(void);
};
my_class::my_class(void) : k(5)  {  std::cout << " k =  " << k; }
Всё передает нормально...

2. изначальный вопрос был не об этом, а:
Код

my_class::my_class()
{
    b.a1 = 70;
    b.a2 = 100;
}
здесь не используется короткая запись... как инициализировать не почленно (ну т.е. одним оператором)
это в данном примере всего лишь два элемента в структуре, а если их штук 5-10? каждый инициализировать почленно?  smile 
ну где же решение  smile 
PM MAIL Skype   Вверх
borisbn
Дата 13.8.2011, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(SolRus @  13.8.2011,  21:19 Найти цитируемый пост)
или ты про структуры что нелья использовать?

я говорю про initializer_list, а не список инициализации в конструкторе.
Цитата(SolRus @  13.8.2011,  21:19 Найти цитируемый пост)
это в данном примере всего лишь два элемента в структуре, а если их штук 5-10?

честно говоря, если в структуре 10 полей, то инициализация их списком может привести к ошибкам - можно легко перепутать параметры местами, а при изменении следования полей вообще каша получится. Думаю, что initializer_list лучше использовать как раз, если в структуре всего пару полей, да ещё и разного типа.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
SolRus
  Дата 13.8.2011, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 6.8.2011

Репутация: нет
Всего: нет



ясно... значит использовать короткую запись нельзя :(

я так понимаю к union это тоже относится...


ps: спасибо borisbn и asmdzen за ответы
_______________

но ведь так можно записывать:
Код

a s = {70,100};  // initializer_list работает же...
b = s;

почему же напрямую нельзя в b так записать?   smile 

Это сообщение отредактировал(а) SolRus - 13.8.2011, 22:03
PM MAIL Skype   Вверх
borisbn
Дата 14.8.2011, 07:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Вообще-то параметры должны быть в круглых скобках…
Попробуй так
my_class::my_class() : b( { 70, 100 } ) {}


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
SolRus
  Дата 14.8.2011, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 6.8.2011

Репутация: нет
Всего: нет



Цитата(borisbn @ 14.8.2011,  07:06)
Попробуй так
my_class::my_class() : b( { 70, 100 } ) {}

ошибка smile 
Цитата
error C2143: синтаксическая ошибка: отсутствие ")" перед "{"
error C2143: синтаксическая ошибка: отсутствие ";" перед "}"
error C2059: синтаксическая ошибка: )
error C2447: {: отсутствует заголовок функции (возможно, используется формальный список старого типа)

 smile 
user posted image

PM MAIL Skype   Вверх
asmdzen
Дата 14.8.2011, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



Цитата(SolRus @  13.8.2011,  21:19 Найти цитируемый пост)
    struct a {
        short a1; 
        short a2;
    } b;


Код

struct a {
        short a1; 
        short a2;
        a(short x, short y) : a1(x), a2(y) {};
    } b;

b(70, 100);


Добавлено через 2 минуты и 59 секунд
Цитата(SolRus @  13.8.2011,  21:44 Найти цитируемый пост)
a s = {70,100};  // initializer_list работает же...
b = s;


initializer_list работает потому что s только сейчас инициализируется, а b уже заинициализирован перед входом в конструктор значениями по умолчанию.

PM MAIL   Вверх
mes
Дата 14.8.2011, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(SolRus @  13.8.2011,  05:14 Найти цитируемый пост)
при таком виде? b = {70,100}; 

Код

b=a({70,100});



--------------------
PM MAIL WWW   Вверх
borisbn
Дата 14.8.2011, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(asmdzen @  14.8.2011,  12:46 Найти цитируемый пост)
b уже заинициализирован перед входом в конструктор значениями по умолчанию

если инициализировать его в списке инициализации конструктора - то нет.



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
asmdzen
Дата 14.8.2011, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



borisbn, так ведь я и написал 
Цитата(asmdzen @  14.8.2011,  12:46 Найти цитируемый пост)
перед входом в конструктор

т.е. имеется ввиду тело конструктора, так что или мы его инициализируем или это само сделается  smile 
а вот это для меня уже что-то новое
Цитата(mes @  14.8.2011,  13:46 Найти цитируемый пост)
b=a({70,100});

интересно как на асме выглядит )
PM MAIL   Вверх
SolRus
  Дата 14.8.2011, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 6.8.2011

Репутация: нет
Всего: нет



из всего что ниже моего последнего поста работает лишь вариант asmdzen с конструктором структуры:
Код
class my_class {
private:
    struct a {
        short a1; 
        short a2;
        a(short x, short y) : a1(x), a2(y) {};
    } b;
public:
    my_class(void);
};
my_class::my_class() : b(70, 100) { }

учитывая что краткая запись (initializer_list) работает только при инициализации я подумал, что может сработать, но не работает:
Код
class my_class {
private:
    struct a {
        short a1; 
        short a2;
    } b = {70,100};    // либо b {70,100};
public:
    my_class(void);
};
и так не сработает:
Код
class my_class {
private:
    enum as {as1=70, as2=100};
    struct a {
        short a1; 
        short a2;
    } b = {as1,as2};    // либо b {as1,as2};
public:
    my_class(void);
};

mes, твой вариант не работает... если не прав приведи полноценный код
Цитата(asmdzen @ 14.8.2011,  18:34)
а вот это для меня уже что-то новое
Цитата(mes @  14.8.2011,  13:46 Найти цитируемый пост)
b=a({70,100});

интересно как на асме выглядит )
не работает эта запись.

ps: и всеже изначальный вопрос сводился к тому чтоб сделать неименованную структуру и инициализровать сразу b короткой записью {} user posted image
PM MAIL Skype   Вверх
mes
Дата 14.8.2011, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(SolRus @  14.8.2011,  20:27 Найти цитируемый пост)
приведи полноценный код

http://liveworkspace.org/code/a42e60309104...986d09ba1f9d85e

Добавлено через 2 минуты и 56 секунд
Цитата(SolRus @  14.8.2011,  20:27 Найти цитируемый пост)
ps: и всеже изначальный вопрос сводился к тому чтоб сделать неименованную структуру и инициализровать сразу b короткой записью {} 

и чтоб объект этой неименнованной структуры был член класса ?  не получится..


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0589 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.