Модераторы: 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   Вверх
SolRus
  Дата 14.8.2011, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(mes @ 14.8.2011,  21:42)
http://liveworkspace.org/code/a42e60309104...986d09ba1f9d85e

не работает...
Цитата("ms vs 2010 express (Microsoft Visual C++ 2010)")
Строка 5: error C2143: синтаксическая ошибка: отсутствие ")" перед "{"
Строка 5: error C2143: синтаксическая ошибка: отсутствие ";" перед "}"
Строка 5: error C2059: синтаксическая ошибка: )
Строка 5: error C2447: {: отсутствует заголовок функции (возможно, используется формальный список старого типа)
Строка 13: error C2143: синтаксическая ошибка: отсутствие ")" перед "{"
Строка 13: error C2143: синтаксическая ошибка: отсутствие ";" перед "{"
Строка 13: error C2143: синтаксическая ошибка: отсутствие ";" перед "}"
Строка 13: error C2059: синтаксическая ошибка: )


Цитата(mes @ 14.8.2011,  21:42)
и чтоб объект этой неименнованной структуры был член класса ?  не получится..

вот получается:
Код

#include <iostream>

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

my_class::my_class() {
    b.a1 = 70;
    b.a2 = 100;
    std::cout  << b.a1 << "  " << b.a2;
}

int main() {
    my_class sdfg;
    std::cin.ignore(std::cin.gcount()).get(); //ждем ввод
    return 0;
}

user posted image

ps: ввели бы на форуме бб код [spoiler], а то у меня какие то громоздкие ответы... user posted image
PM MAIL Skype   Вверх
borisbn
Дата 15.8.2011, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



SolRus, ключевое здесь
Цитата(SolRus @  14.8.2011,  22:26 Найти цитируемый пост)
"ms vs 2010 express (Microsoft Visual C++ 2010)"

Ну нету в студии initialize_list. Не сделали ещё. Делай по старинке - конструктор с параметрами (вариант от asmdzen)


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


Новичок



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

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



блин на этом сайте - liveworkspace.org  smile работает код mes (я сначала непонял, что это компилятор онлайн), а также эти записи:
b = {70,100};
my_class::my_class() : b( { 70, 100 } ) {}

Цитата(borisbn @ 15.8.2011,  00:36)
Ну нету в студии initialize_list. Не сделали ещё.

ага, из этого следует что msvs позволяет использовать initializer_list только для тех переменных для которых еще не выделена память..
собсно это то что сказал asmdzen: 
Цитата(asmdzen @ 14.8.2011,  12:46)
initializer_list работает потому что s только сейчас инициализируется, а b уже заинициализирован перед входом в конструктор значениями по умолчанию.


по сайту - какой он компилятор использует? gcc?
и подскажите как на том сайте зарегится? чет кнопка регистрация не работает... и вообще сайт состоит из одной страницы?  smile 
на сайте любое изменение кода и по запуску создается новый файл с его ссылкой, сколько же на сервере файлов уже?  smile  видимо через некое время он их удаляет...

ps: думаю после ответа о сайте можно будет пометить эту тему как решенную  smile 
PM MAIL Skype   Вверх
borisbn
Дата 15.8.2011, 02:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



SolRus, 
1. LiveWorkSpace курирует boostcoder. У него в подписи информация о компиляторе и библиотеках
см. http://forum.vingrad.ru/users/boostcoder
2. Регистрироваться там не нужно
3. Есть сайты поудобнее (codepad.org, например), но там древняя версия компилятора, а на LWS одна из самых последних


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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