Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+中的OOD+;:只有一个方法的类? 我在C++中编写程序,并考虑面向对象的设计,在数据库中保存旧汽车的记录。我有一个按年份对汽车进行排序的函数,但是这个函数应该是它自己类中的一个方法,还是汽车类中的一个方法,或者只是任何类之外的一个函数?我们被教导在面向对象的设计中,一切都应该在它自己的类中,每个类应该只有一个职责,所以我倾向于在它自己的类中将函数作为一种方法,但这似乎是不必要的。我该怎么办_C++_Function_Class_Methods_Object Oriented Analysis - Fatal编程技术网

C+中的OOD+;:只有一个方法的类? 我在C++中编写程序,并考虑面向对象的设计,在数据库中保存旧汽车的记录。我有一个按年份对汽车进行排序的函数,但是这个函数应该是它自己类中的一个方法,还是汽车类中的一个方法,或者只是任何类之外的一个函数?我们被教导在面向对象的设计中,一切都应该在它自己的类中,每个类应该只有一个职责,所以我倾向于在它自己的类中将函数作为一种方法,但这似乎是不必要的。我该怎么办

C+中的OOD+;:只有一个方法的类? 我在C++中编写程序,并考虑面向对象的设计,在数据库中保存旧汽车的记录。我有一个按年份对汽车进行排序的函数,但是这个函数应该是它自己类中的一个方法,还是汽车类中的一个方法,或者只是任何类之外的一个函数?我们被教导在面向对象的设计中,一切都应该在它自己的类中,每个类应该只有一个职责,所以我倾向于在它自己的类中将函数作为一种方法,但这似乎是不必要的。我该怎么办,c++,function,class,methods,object-oriented-analysis,C++,Function,Class,Methods,Object Oriented Analysis,它本身应该是一个函数,而不是任何类的成员。大概是这样的: void sortCars(Car * lot, unsigned int numCars) ... 在没有其他成员的类中包装这一点是没有意义的;这样做不会解决任何问题,也不会让事情变得更容易 让它成为Car的成员是没有意义的,这样做会让它可以访问该类的私有成员,而这些成员并不需要,这是自找麻烦 “一切都应该在它自己的类中”是一个粗略的准则,它更适用于名词(Car)而不是动词(sortCars)。正如@meet所说,尽量避免使用全局

它本身应该是一个函数,而不是任何类的成员。大概是这样的:

void sortCars(Car * lot, unsigned int numCars)
  ...
在没有其他成员的类中包装这一点是没有意义的;这样做不会解决任何问题,也不会让事情变得更容易

让它成为
Car
的成员是没有意义的,这样做会让它可以访问该类的私有成员,而这些成员并不需要,这是自找麻烦


“一切都应该在它自己的类中”是一个粗略的准则,它更适用于名词(
Car
)而不是动词(
sortCars
)。

正如@meet所说,尽量避免使用全局函数。此外,我认为确定数据库与汽车之间的关系类型很重要


例如,在我看来,一辆二手车有一个-a(而不是is-a,它将进入继承)数据库,因此,它可以作为一个单独的函数而不是自己的类来实现

尽管我倾向于使用一个简单的函数来完成这项工作,并将其放在某个名称空间中,如

namespace CarUtils {
    void sort(Car *carsArr, const size_t & arrSize) {
        // code ...
     }
};
然而,当您了解更多类似STL的内容以及
算法
向量
等功能时,您会发现
排序
算法在build中

现在您只需要给出您的
比较函数对象

namespace CarUtils {  // i would still put things in namespace :)
       struct SortByMileage {
              bool operator()(const Car & c1, const Car & c2) {
                  return c1.mileage < c2.mileage;
              }
       };

       struct SortByYear {
              bool operator()(const Car & c1, const Car & c2) {
                  return c1.purchaseDate.year < c2.purchaseDate.year;
              }
       };
};
namespace-CarUtils{//我还是会把东西放在namespace:)
结构排序码{
布尔运算符()(常数车和c1、常数车和c2){
返回c1.里程
然后在代码中:

// #include <algorithm>  // include this file.
std::sort(cars, cars + sizeOfCarArr, CarUtils::SortByMileage());
// and to sort by year
std::sort(cars, cars + sizeOfCarArr, CarUtils::SortByYear());
/#包含//包含此文件。
std::sort(cars,cars+sizeofcarar,CarUtils::SortByMileage());
//按年份分类
std::sort(cars,cars+sizeofcarar,CarUtils::SortByYear());
这种方法更好,因为,老实说,您不应该一次又一次地为不同种类的排序编写排序函数,如按里程数或按容量等

但是。。再次回到我们的哲学,即只在需要函数的地方使用函数。。我们可以使用lambdas(C++11特性):)

std::sort(cars,cars+sizeofcarar,[](const Car&c1,const Car&c2){
返回c1.里程

要使用C++11,您需要将
-std=C++11
传递给编译器。

此外,即使该类不包含数据成员,也只包含一个方法的类是否需要构造函数?您对cars使用什么类型的容器(例如数组)?您是否熟悉标准库容器(例如,
vector
)?@beta这将是一个用于汽车的阵列,是的。很抱歉,我对此并不熟悉,我对c++@beta中的类和面向对象设计的知识非常有限。我只是被教导使用“使用名称空间std”,如果这适用于你所说的话。我要给你的最好建议是,不要再认为OOP/OOD是一种近乎宗教层面的神圣事物。设计是由许多因素驱动的,最后一个因素是团队的需要,团队必须顺利合作。没有OO方法可以证明问题的一个分区比另一个分区更正确。另外,OOP并不意味着任何东西都必须在类中。类是有用的抽象。但不是“必须”。例如,不能针对某个方法说任何话:
void SortByAge(CarList&cars)或<代码>CarList Sortbage(const CarList&cars)一辆车
怎么会有一个
数据库?因为数据库是这类车的一个属性?你没有一个没有任何汽车的二手车数据库。数据库将包含汽车信息,如年龄等。。这个年龄将是car的一个成员/属性。类可以包含访问此属性的方法。。但是用这个属性做任何事情,比如(排序)不是汽车的属性。。它不应该是课堂的一部分。
std::sort(cars, cars + sizeOfCarArr, [](const Car & c1, const Car & c2) {
       return c1.mileage < c2.mileage;
});

std::sort(cars, cars + sizeOfCarArr, [](const Car & c1, const Car & c2) {
       return c1.purchaseDate.year < c2.purchaseDate.year;
});