C++ 类不会在添加后保留对象的向量

C++ 类不会在添加后保留对象的向量,c++,c++11,C++,C++11,我的代码如下所示。问题出在int main函数内部,r.printItems没有打印任何内容。我错过了什么 main.cpp 菜单 FoodItem.h 当main.cpp中的createMenu设置菜单时,它会创建一个名为c1的本地类别对象,并将其添加到菜单中,当将其按入MenuCreator::categories向量时,会复制c1。创建该副本时,尚未将餐厅对象添加到c1。因此,当随后将餐厅添加到c1时,副本不会更新。这就是为什么当MenuCreator::getRestaurantsFor

我的代码如下所示。问题出在int main函数内部,r.printItems没有打印任何内容。我错过了什么

main.cpp

菜单

FoodItem.h

当main.cpp中的createMenu设置菜单时,它会创建一个名为c1的本地类别对象,并将其添加到菜单中,当将其按入MenuCreator::categories向量时,会复制c1。创建该副本时,尚未将餐厅对象添加到c1。因此,当随后将餐厅添加到c1时,副本不会更新。这就是为什么当MenuCreator::getRestaurantsForCategory试图返回餐厅对象时,菜单中没有餐厅对象

在将c1添加到菜单之前,将createMenu更改为完全初始化c1,例如:

无效创建菜单{ m1.createMenusg; c1类; c1.非素食者; 餐厅r1; r1.abc; r1.setDescriptionTest餐厅; createRestaurantItemr1; c1.添加餐厅R1;
m1.addCategoryc1;//列表是空的?您是否尝试过使用调试器?请提供一个以最小化为重点的示例,并解释您的代码应该做什么是的,@OznOg调试了餐厅内的代码FoodItem列表是空的,当我通过MenuCreator文件获取它时,您的代码有相当大的改进空间,不必要使用这是->,朗应该是经度,在GynAuto中,你应该调用RealStand而不是保留,等等。一旦你得到了一个工作程序,就考虑把它放在上面。在CeCaleMeMu中,你可以在M1.AdQueCyryC1之后调用C1.AddioMeals.在M1中存储的C1的拷贝在它中没有任何餐馆。有没有办法通过引用传递给我,这样我就没有了。要保持添加的顺序?@mrugeshtaker除非使用std::reference\u包装器,否则无法在std::vector中存储引用,但当对象超出范围时,可能会出现挂起引用的风险。您可以存储指针,这意味着使用带有new/std::unique\u ptr的动态分配。否则,您可能需要重新设计。例如,让人uCreator::addCategory、MenuCreator::addRestaurantForCategory、Category::addRestaurants、Restaurant::addItems等不将对象作为输入,而是在内部创建和存储对象,然后返回对该对象的引用,以便调用方根据需要填写。
#include <bits/stdc++.h>
#include "Customer.h"
#include "MenuCreator.h"
#include "FoodItem.h"

MenuCreator m1;

void createCustomer() {
    Customer c1("mrg", "m@gmail.com", "9654357", "+91");
}

void createRestaurantItem(Restaurant &rest) {
    rest.addItems(FoodItem("t1"));
    rest.addItems(FoodItem("D1"));
}

void createMenu() {
    m1.createMenu("sg");
    Category c1;
    c1.setName("Non-veg");
    m1.addCategory(c1);
    Restaurant r1;
    r1.setName("ABC");
    r1.setDescription("Test Restaurant");
    createRestaurantItem(r1);
    c1.addRestaurants(r1);
}

vector<Restaurant> getRestaurantsForCategory(string category) {
    return m1.getRestaurantsForCategories(category);
}


int main() {
    createCustomer();
    createMenu();
    for (auto r: getRestaurantsForCategory("Non-veg")) {
        r.printItems();
    }
    return 0;
}
#include <bits/stdc++.h>
#include "Menu.h"

using namespace std;

class MenuCreator {

public:

    void createMenu(string name) {
        Menu m1;
        m1.setName(name);
        menu = m1;
    }

    void addCategory(const Category &categ) {
        categories.push_back(categ);
    }

    const Menu &getMenu() const {
        return menu;
    }

    const vector<Category> &getCategories() const {
        return categories;
    }

    void addRestaurantForCategory(string name, const Restaurant restaurant) {
        for(auto categ: categories) {
            if (categ.getName() == name) {
                categ.addRestaurants(restaurant);
            }
        }
    }

    const vector<Restaurant> &getRestaurantsForCategories(string category) {
        for(auto categ: categories) {
            if(categ.getName() == category) return categ.getRestaurants();
        }
    }

private:
    Menu menu;
    vector<Category> categories;
};
#include<bits/stdc++.h>
#include "Category.h"

using namespace std;

class Menu {
public:
    const string &getName() const {
        return name;
    }

    void setName(const string &name) {
        Menu::name = name;
    }

private:
    string name;
    string description;
    vector<Category> categories;
};
using namespace std;

class Category {
public:
    const string &getName() const {
        return name;
    }

    void setName(const string &name) {
        Category::name = name;
    }

    const string &getDescription() const {
        return description;
    }

    void setDescription(const string &description) {
        Category::description = description;
    }

    const vector<Restaurant> &getRestaurants() const {
        return restaurants;
    }

    void setRestaurants(const vector<Restaurant> &restaurants) {
        Category::restaurants = restaurants;
    }

    void addRestaurants(const Restaurant &rt) {
        Category::restaurants.push_back(rt);
    }

private:
    string name;
    string description;
    vector<Restaurant> restaurants;
};
#include <bits/stdc++.h>
#include <vector>
#include "FoodItem.h"

using namespace std;

class Restaurant {
public:

    Restaurant() {
        this->id = gen_random(12);
    }

    virtual ~Restaurant() {

    }

    const string &getName() const {
        return name;
    }

    void setName(const string &name) {
        Restaurant::name = name;
    }

    const string &getDescription() const {
        return description;
    }

    void setDescription(const string &description) {
        Restaurant::description = description;
    }

    double getLat() const {
        return lat;
    }

    void setLat(double lat) {
        Restaurant::lat = lat;
    }

    double getLang() const {
        return lang;
    }

    void setLang(double lang) {
        Restaurant::lang = lang;
    }

    const string &getImageUrl() const {
        return imageUrl;
    }

    void setImageUrl(const string &imageUrl) {
        Restaurant::imageUrl = imageUrl;
    }

    const string &getVideoUrl() const {
        return videoUrl;
    }

    void setVideoUrl(const string &videoUrl) {
        Restaurant::videoUrl = videoUrl;
    }

    const vector<FoodItem> &getItems() const {
        return items;
    }

    void setItems(const vector<FoodItem> &items) {
        Restaurant::items = items;
    }

    void addItems(const FoodItem &item) {
        this->items.push_back(item);
    }

    string gen_random(const int len) {
        string tmp_s;
        static const char alphanum[] =
                "0123456789"
                "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                "abcdefghijklmnopqrstuvwxyz";
        srand( (unsigned) time(NULL) * getpid());
        tmp_s.reserve(len);
        for (int i = 0; i < len; ++i)
            tmp_s += alphanum[rand() % (sizeof(alphanum) - 1)];
        return tmp_s;

    }

    const string &getId() const {
        return id;
    }

    void printItems() {
        for(auto it: items) {
            cout<<"item: "<<it.getName()<<endl;
        }
    }


private:
    string id;
    string name;
    string description;
    double lat;
    double lang;
    string imageUrl;
    string videoUrl;
    string createdAt;
    string updatedAt;
    vector<FoodItem> items;
};
#include <bits/stdc++.h>
#include <vector>
#include "FoodItem.h"

using namespace std;

class Restaurant {
public:

    Restaurant() {
        this->id = gen_random(12);
    }

    virtual ~Restaurant() {

    }

    const string &getName() const {
        return name;
    }

    void setName(const string &name) {
        Restaurant::name = name;
    }

    const string &getDescription() const {
        return description;
    }

    void setDescription(const string &description) {
        Restaurant::description = description;
    }

    double getLat() const {
        return lat;
    }

    void setLat(double lat) {
        Restaurant::lat = lat;
    }

    double getLang() const {
        return lang;
    }

    void setLang(double lang) {
        Restaurant::lang = lang;
    }

    const string &getImageUrl() const {
        return imageUrl;
    }

    void setImageUrl(const string &imageUrl) {
        Restaurant::imageUrl = imageUrl;
    }

    const string &getVideoUrl() const {
        return videoUrl;
    }

    void setVideoUrl(const string &videoUrl) {
        Restaurant::videoUrl = videoUrl;
    }

    const vector<FoodItem> &getItems() const {
        return items;
    }

    void setItems(const vector<FoodItem> &items) {
        Restaurant::items = items;
    }

    void addItems(const FoodItem &item) {
        this->items.push_back(item);
    }

    string gen_random(const int len) {
        string tmp_s;
        static const char alphanum[] =
                "0123456789"
                "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                "abcdefghijklmnopqrstuvwxyz";
        srand( (unsigned) time(NULL) * getpid());
        tmp_s.reserve(len);
        for (int i = 0; i < len; ++i)
            tmp_s += alphanum[rand() % (sizeof(alphanum) - 1)];
        return tmp_s;

    }

    const string &getId() const {
        return id;
    }

    void printItems() {
        for(auto it: items) {
            cout<<"item: "<<it.getName()<<endl;
        }
    }


private:
    string id;
    string name;
    string description;
    double lat;
    double lang;
    string imageUrl;
    string videoUrl;
    string createdAt;
    string updatedAt;
    vector<FoodItem> items;
};