2016-04-21 3 views
-6

Я пытаюсь передать массив структур из функции. я много искал, но не смог найти способ этого. ниже - код, которым я управляю.Возвращает массив struct из функции C++

struct menuItemType 
{ 
    int itemNo; 
    string menuItem; 
    double price; 
}; 

void getData(menuItemType *menuList[10]) 
{ 
    menuList[0]->itemNo = 111; 
    menuList[0]->menuItem = "Apple";  
    menuList[0]->price = 2.00; 

    .... 
    menuList[0]->itemNo = 120; 
    menuList[0]->menuItem = "Chocolate";  
    menuList[0]->price = 5.00; 
} 

int main() 
{ 
    /* i know that i can't return a array. but i want to get the menuList[10] values here. 
    not sure which code i have to use..*/ 
} 
+1

'main int()' ?? – Quentin

+0

извините ввод проблема. i mean int main() {} –

+0

[std :: array] (http://en.cppreference.com/w/cpp/container/array) - это тонкая оболочка вокруг массивов, которая * может * быть возвращена из функций. – melak47

ответ

2

Ваш void getData(menuItemType *menuList[10]) ничего не возвращает. Вместо этого он заполняет данные в памяти, указанной параметром ввода.

int main() 
{ 
    menuItemType data[10]; 
    getData(&data); 
    std::cout << data[9].menuItem << std::endl; // Chocolate 
} 

Однако почему вы настаиваете на использовании низкоуровневых массивов? Вместо этого используйте std::vector.

std::vector<menuItemType> getData() 
{ 
    std::vector<menuItemType> data; 
    data.push_back({111, "Apple", 2.00}); 
    ... 
    data.push_back({120, "Chocolate", 5.00}); 
    return std::move(data); 
} 

int main() 
{ 
    std::vector<menuItemType> data = getData(); 
    std::cout << data[9].menuItem << std::endl; // Chocolate 
} 

Это будет печатать Chocolate, потому что я предполагаю, что есть опечатка в коде.

+0

Вы также можете использовать std :: map , если хотите на самом деле индексировать itemNo (предположительно факторинга itemNo из структуры). Или вы могли бы использовать boost :: multi_index, если бы вы хотели получить амбициозность, что позволило бы вам индексировать более чем один атрибут (хешировать по itemNo, упорядочиваться по цене и т. Д.) – bdow

+1

Но этого не требовалось. Это должно перейти к [обзору кода] (http://codereview.stackexchange.com/). – Zereges

+0

Благодарим вас за помощь, но это приводит к ошибкам компиляции: main.cpp: 17: 20: warning: расширенные списки инициализаторов доступны только с -std = C++ 11 или -std = gnu ++ 11 data.push_back ({ 111, «Apple», 2.00}); main.cpp: 19: 12: error: 'move' не является членом команды 'std' return std :: move (data); main.cpp: В функции 'Int основной()': main.cpp: 25: 18: ошибка: слишком много аргументов для функции 'станд :: вектор GetData()' GetData (&data); ^ основной .cpp: 14: 27: note: объявлено здесь std :: vector getData() –

Смежные вопросы