Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как правильно заполнить структуру?


Автор: Alca 14.8.2008, 17:46
Как правильно заполнить структуру?
Код

typedef struct {
    std::string sVar1; 
    std::string sVar2; 
} SMystruct, *PSMystruct;

Автор: SaDFromSpb 14.8.2008, 17:50
SMystruct s = {"раз", "два"};

Автор: LavYaAll 14.8.2008, 17:56
Ну или так: 
Код

SMystruct SMystruct1;
SMystruct1.sVar1 = "Трах";
SMystruct1.sVar2 = "Тибидох";

О чем вопрос?  Мы наверное что-то не поняли. smile 

Автор: Alca 14.8.2008, 17:56
А так правильно?
Код

SMystruct g_stMystruct;
g_stMystruct.sVar1 = "раз";
g_stMystruct.sVar2 = "два";

Просто чувак Daevaorn втирал мне следующее:
Цитата

А кто вам сказал, что так заполняют структуры?

http://forum.vingrad.ru/forum/topic-224443.html

Автор: Lazin 14.8.2008, 17:58
Цитата(Alca @ 14.8.2008,  17:56)
А так правильно?
Код

SMystruct g_stMystruct;
g_stMystruct.sVar1 = "раз";
g_stMystruct.sVar2 = "два";

смотря где
если внутри функции то правильно

Автор: Alca 14.8.2008, 18:01
А что структура не может быть глобальной?
А если она глобальная то ее надо как-то по-другому заполнять????

Автор: LavYaAll 14.8.2008, 18:04
Alca, нет. Имеется в виду, что заполнять ее ты при помощи оператора '=' сможешь только в какой-либо функции.

Автор: Alca 14.8.2008, 18:05
Так она у меня там и заполняется.

Автор: SaDFromSpb 14.8.2008, 18:11
Цитата(LavYaAll @  14.8.2008,  18:04 Найти цитируемый пост)
Alca, нет. Имеется в виду, что заполнять ее ты при помощи оператора '=' сможешь только в какой-либо функции. 

Верно. А инициализировать структуру в месте ее объявления (как в моем примере) можно через оператор = в любом месте.

Добавлено через 59 секунд
Всмысле, не то что бы совсем в любом, но в глобальной области видимости тоже.... =)

Автор: Alca 14.8.2008, 18:13
Спасибо. smile 

Автор: bsa 14.8.2008, 22:48
Alca, я бы сделал так:
Код
struct MyStruct{
    std::string sVar1; 
    std::string sVar2; 
    MyStruct(const std::string &v1, const std::string &v2) : sVar1(v1), sVar2(v2) {}
};
Тогда в любом месте программы (кроме объявлений структур/классов) можно написать:
Код
MyStruct g_stMystruct("раз", "два");
Что приведет к нужному тебе результату.
Кстати, делать typedef для структур/классов в C++ необязательно. Делать новый тип:
Код
typedef MyStruct* MyStructPtr;
вредно, так как невозможно сделать указатель на константный объект:
Код
const MyStructPtr p_var;
Это будет константный указатель на неконстантный объект (кстати, в данном виде даже не скомпилируется, так как нужно проинициализировать). К тому же, такой новый тип даже не экономит время на "набивку" программы.

Автор: Alca 15.8.2008, 09:13
bsa, спасибо за совет чувак!!!  smile  smile  smile 

Автор: bsa 17.8.2008, 16:21
Цитата(Alca @ 15.8.2008,  09:13)
bsa, спасибо за совет чувак!!!  smile  smile  smile

Обычно, на этом форуме благодарят путем поднятия репутации.
Кстати, есть одна из версий происхождения слова "чувак" (в переводе с тюркских языков "кастрированный кабан"), которая мне не очень нравится, особенно, когда это слово относится ко мне. Поэтому, попрошу в предь воздержаться от его применения по отношению ко мне.

Автор: SABROG 17.8.2008, 16:41
Взято из википедии:

Цитата

Чувак — «юноша, мужчина», дружеское обращение к человеку мужского пола, (к лицам женского пола см. Чувиха), популярное в молодёжной среде. По , вторым значением слова по словарю Ожегова и раннему словарю Даля было определение «кастрированный кабан». (В словаре Ожегова никогда не было слова чувак, так же как не существовало "раннего" словаря Даля. Кастрированного кабана или барана придумали специально для развода хиппарей на пушкинской у кафе лира, потому что они по другому не обращались ни к кому, а с этой присказкой было удобно их разводить.)


Может быть не все так плохо smile

Автор: bsa 17.8.2008, 20:55
Цитата(SABROG @ 17.8.2008,  16:41)
Может быть не все так плохо smile

Я не только на этот источник опирался. Имхо, слово просто с "душком".  smile 

Автор: Ln78 20.8.2008, 15:26
Цитата(bsa @  14.8.2008,  23:48 Найти цитируемый пост)
 Делать новый тип:
typedef MyStruct* MyStructPtr;
вредно, так как невозможно сделать указатель на константный объект:

Я не совсем понял, а из того, что никакой typedef не сумеет перемножить два 64-разрядных целых (и поджарить котлеты тоже не сумеет smile ) следует, что сам typedef вреден? А разве не "кесарю кесарево":
Код

   typedef MyStruct* MyStructPtr; 
   typedef const MyStruct* ConstMyStructPtr; 

   MyStruct g_stMystruct("раз", "два");
   const MyStruct g_cstMystruct("три", "четыре");

   MyStructPtr g_pMystruct = &g_stMystruct;
   ConstMyStructPtr g_pcMystruct = &g_cstMystruct;

В чём вред-то?

Автор: bsa 20.8.2008, 20:18
Вред в том, что, например, есть такая библиотека DevIL (openil.sf.net). В ней сделан:
Код
typedef char * IL_String;
А затем используется:
Код
IL_Load(const IL_String name);
Все! После этого без const_cast не обойтись! А вся проблема в том, что неопытный программист сделал вредный (для него вредный) typedef.
Я не против typedef. Более того, я даже убить готов тех, кто пишет: vector<vector<vector<vector int> > > array; Но есть вещи, которые делать не стоит. Покрайней мере, пока не осознаешь явную необходимость в них.

Автор: Ln78 21.8.2008, 06:34
bsa, понимать, что делаешь, всегда полезно smile .
Но из того, что неопытный программист может сделать какую-то ошибку, не следует категоричный вывод о вредности тех или иных синтаксических конструкций. А как же столь любимые JackYF'ом  LPCSTR, LPSTR и другие подобные определения?

Автор: bsa 21.8.2008, 13:19
Цитата(Ln78 @ 21.8.2008,  06:34)
А как же столь любимые JackYF'ом  LPCSTR, LPSTR и другие подобные определения?

Имхо, WinAPI далеко не лучший пример грамотного дизайна.  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)