使用 "dummy" 对象来促进 C++ 可接受的 OOP,是否存在更好的替代方案?

Is using "dummy" objects to facilitate OOP acceptable in C++, and does a better alternative exist?

我是 C++ 的新手,在完成教科书中使用用户定义的 classes 的练习时,我发现创建 "dummy"/"placeholder" 很有帮助其唯一目的是方便在 `int main()' 中使用 functions/vectors 的对象。我收到的编译器错误表明此类向量和函数需要附加到 class 的对象,因此我创建了一个虚拟对象来满足该需求。

我想知道这是否是一种可接受的编程实践,或者是否存在更好的替代方法。 (此外,如果有比 "dummy objects," 更常用的术语来表示这种做法,请告诉我。)

我以下面的 'program' 为例。 Food x 本身没有实际意义;然而,它允许我在 'int main()' 中使用 'foodentry()' 和 'favoritefoods' 向量,因为看起来这些项目需要附加到一个对象上——而 'Food x' 是我唯一的对象。

一如既往地感谢您的意见。

using namespace std;
#include <iostream>
#include <vector>

class Food
{
public:
    string favoritefruit;
    string favoritedessert;
    vector<Food> favoritefoods;
    Food(string a, string b)
        : favoritefruit(a), favoritedessert(b) {}
    void foodentry();
};
//"Placeholder" object. It doesn't do anything except allow me
//to use the function and vector entries in int (main). If I
//don't precede the function and vector entries in int (main)
//with the object x, they show up as undefined. Is there 
//another way to get the function and vector entries in int //main() to work?
Food x{" ", " "};

void Food::foodentry()
{
    cout << "Please enter your favorite fruit, other than oranges:\n";
    cin >> favoritefruit;
    cout << "Now please enter your favorite dessert, other than cookies:\n";
    cin >> favoritedessert;
    favoritefoods.push_back(Food{favoritefruit, favoritedessert});
}

int main()

{
    x.favoritefoods.push_back(Food{"oranges", "cookies"});
    x.foodentry();

    cout << "Here are two great fruits: ";
    for (int y = 0; y < x.favoritefoods.size(); y++)
    {
        cout << x.favoritefoods[y].favoritefruit << " ";
    }
    cout << "\nAnd here are two great desserts: ";
    for (int y = 0; y < x.favoritefoods.size(); y++)
    {
        cout << x.favoritefoods[y].favoritedessert << " ";
    }
}

您需要虚拟对象这一事实在某种程度上表明 class 设计不太理想。

问问自己,Food 代表什么?看起来应该是代表一对食物名称,代表自己最喜欢的水果和甜点。似乎没有理由让这个 class 本身也包含 Food 个对象的集合 (这种组合通常出现在分层数据结构的实现中)。它与这里无关。

更典型的情况是,您会像这样构建一个简单的程序:

class Food
{
public:
    string favoritefruit;
    string favoritedessert;
};

void FoodEntry(std::vector<Food>& Foods) <-- note: passed by reference
{
   ...
}

int main()
{
    std::vector<Food> foods;
    foods.push_back(Food{"oranges", "cookies"});
    FoodEntry(foods);
    ...
}

在某种复杂程度下,您可能希望将向量和 FoodEntry 方法封装到专​​用的 class,例如FoodCollector.