Инициализация динамического массива структур

Как можно инициализировать массив структур, память под который выделена с помощью операции new? Пытался сделать так — не получается... Помогите, пожалуйста :)

#include <iostream>
const int SIZE = 50;    
struct man
{
    char name[SIZE];
    double wght;
    int KKal;
};
int main()
{
    man*p_man = new man[3];
    *p_man =
    {
         {"Pol", 72.3, 56},
         {"Helen", 56.7, 125},
         {"Roy", 83.4, 84}
    };

    Console::ReadLine();
    return 0;
}

Одно из двух не имеет смысла делать: либо динамически выделять память, либо статически инициализировать структуру.

Когда ты пишешь в программе данные для инициализации переменной, то при работе программы эти данные уже будут занимать память, а обратиться к этим данным можно через имя переменной соотв. типа.

Череп, пролей свет в темноту. Потому что, много пишут о том, как что-либо использовать, но мало о том где и для чего это используется.
Если я правильно понял, то динамически выделяемые структуры предназначены исключительно для ввода, хранения и отображения информации. И инициализировать динамическую структуру можно только с помощью cin и функций членов getline() и get() во время выполнения программы, либо почленно.
Например так:

#include <iostream>
const int SIZE = 50;    
struct man
{
    char name[SIZE];
    double wght;
    int KKal;
};
int main()
{
    using namespace std;
    man*p_man = new man[3];
    std::cout << "Enter the first name: ";
    std::cin.getline(p_man[0].name, SIZE);
    std::cout << "Enter the second name: ";
    std::cin.getline(p_man[1].name, SIZE);
    std::cout << "Enter a weight of the first man: ";
    std::cin >> p_man[0].wght;
    std::cout << "Enter a weight of the second man: ";
    (std::cin >> p_man[1].wght).get();
    std::cout << "Enter the third name: ";
    std::cin.getline(p_man[2].name, SIZE);
    p_man[2].wght = p_man[0].wght+p_man[1].wght;
    std::cout << p_man[2].name << "'s weight is ";  
    std::cout << p_man[2].wght << " kg.";
    delete [] p_man;
    Console::ReadLine();  
    return 0;
}

Если я правильно понял, то динамически выделяемые структуры предназначены исключительно для ввода, хранения и отображения информации. И инициализировать динамическую структуру можно только с помощью cin и функций членов getline() и get() во время выполнения программы, либо почленно.

Неправильно ты понял.

Динамически создаваемые структуры, так же как и обычные (автоматические) структуры могут использоваться для любых целей. В С++ структура — это класс, в котором все члены и методы открытые (public). Т.е. структура, в примитивном случае, — это способ собрать в один флакон разнотипные данные. Например, структуру можно использовать для возврата из функции нескольких значений: функция «упаковывает» результаты своей работы в переменную-структуру и возвращает её вызывающему коду.

Твою программу можно переписать с минимальнейшими изменениями, что бы она не использовала динамическое распределение памяти:

int main()
{
    using namespace std;
    man p_man[3];
    std::cout << "Enter the first name: ";
    std::cin.getline(p_man[0].name, SIZE);
    std::cout << "Enter the second name: ";
    std::cin.getline(p_man[1].name, SIZE);
    std::cout << "Enter a weight of the first man: ";
    std::cin >> p_man[0].wght;
    std::cout << "Enter a weight of the second man: ";
    (std::cin >> p_man[1].wght).get();
    std::cout << "Enter the third name: ";
    std::cin.getline(p_man[2].name, SIZE);
    p_man[2].wght = p_man[0].wght+p_man[1].wght;
    std::cout << p_man[2].name << "'s weight is ";  
    std::cout << p_man[2].wght << " kg.";
    Console::ReadLine();  
    return 0;
}

Между этими двумя вариантами отличие только в том, где будет выделяться память для хранения структур: в куче (твой вариант), или в стеке (мой вариант). Работа с кучей предпочтительна для больших объёмов данных, но работает чуть медленнее за счёт необходимости выделения и освобождения памяти в куче.

Ты не мешай в одну кучу концепцию структур (и, заодно, классов) и способ создания переменной типа структуры.

Но, с другой стороны, в С/С++ надо всегда чётко понимать где и как выделяется/освобождается память при работе с данными различных типов. И что собственно содержит переменная: данные, указатель на данные (адрес в памяти) или ссылку на данные (тоже адрес в памяти, но с отличным от указателя синтаксисом). Особенно надо быть внимательным при передаче параметров в функции и возврате результатов.

На счёт того, для чего могут использоваться структуры — возьми пяток книг по С++ и почитай про структуры. Я думаю, что 5-10-15 примеров использования структур ты найдёшь )) А если учесть, что классы — это структуры с разграничением доступа, то весь мир ООП — к твоим ногам )))

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.