使用 "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
.
我是 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
.