Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.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++ 我们如何确定函数应该包含在哪个类中_C++_Oop - Fatal编程技术网

C++ 我们如何确定函数应该包含在哪个类中

C++ 我们如何确定函数应该包含在哪个类中,c++,oop,C++,Oop,以停车场为例。设计一个停车场,在不同类型的停车位管理不同类型的车辆的停车/停车。我们可以首先定义一个类停车场,它包含停车位、总楼层、宽度、停车场长度等。然后我们定义类车辆,它可以由不同的车辆类型继承,如汽车、摩托车等。我们甚至可以定义类停车位类 我所困惑的是应该在哪个类中实现动作函数,比如park()和unpark()。似乎这些功能都与我提到的三类相关:停车场、车辆、停车位 如果有多个相关的类,谁能解释一下我们应该把一个函数放在哪个类中?如果我们把停车场看作一个汽车的容器,那么就像通常做的那样,

以停车场为例。设计一个停车场,在不同类型的停车位管理不同类型的车辆的停车/停车。我们可以首先定义一个类停车场,它包含停车位、总楼层、宽度、停车场长度等。然后我们定义类车辆,它可以由不同的车辆类型继承,如汽车、摩托车等。我们甚至可以定义类停车位类

我所困惑的是应该在哪个类中实现动作函数,比如park()和unpark()。似乎这些功能都与我提到的三类相关:停车场、车辆、停车位


如果有多个相关的类,谁能解释一下我们应该把一个函数放在哪个类中?

如果我们把停车场看作一个汽车的容器,那么就像通常做的那样,park()函数应该放在容器中。然而,这类事情确实会随着设计的发展而发生变化。

如果我们将停车场视为汽车的容器,那么通常情况下,park()函数应该在容器中。然而,这类事情实际上可能会随着设计的发展而发生变化。

请看一看,它通常表示应该为每个类分配一组密切相关的操作

试着把你的课分成名词和动词(动作),这样你就可以说:-

  • 车辆->停车场()
  • 停车场->接受(车辆)
  • 停车场->管理(车辆),包含(车辆)
etc

看一看,它通常表示应该为每个类分配一组密切相关的操作

试着把你的课分成名词和动词(动作),这样你就可以说:-

  • 车辆->停车场()
  • 停车场->接受(车辆)
  • 停车场->管理(车辆),包含(车辆)

这真的取决于你想要实现什么,不,这并不意味着“没关系,我们可以把它放在任何一门课上,只要它起作用”——一般来说,设计得不好的方法比设计得好的方法更多,即使好的方法和坏的方法都“起作用”。显然,如果你不在乎这个解决方案是否好,你可以做任何你喜欢的事情

例如,如果你正在模拟一个停车场经理,他正试图通过决定哪些车辆去哪里来优化交通流,那么很明显,你不会希望个别车辆做出停车决定,否则这将完全违背你试图实现的目标。也许你会有一个管理器对象,将车辆对象放在停车场对象的停车位对象中,或者你会简化,让停车场“做出决定”。如果你只想模拟在一个公共停车场被动发生的事情,在那里司机们选择他们到达的第一个空闲空间,那么也许你会让汽车对象来做


与任何其他模型一样,您是从现实中抽象出来的,并且关注重要的元素,因此您需要确定这些元素是什么,以及您希望它们做什么,并相应地设计您的类。一旦您为您的特定应用程序找到了最佳模型,那么这些类实际上将自己编写

这真的取决于你想要实现什么,不,这并不意味着“这不重要,只要它有效,我们可以把它放在任何一门课上”——一般来说,设计糟糕的方法比设计好的方法更多,即使好的方法和坏的方法都“有效”。显然,如果你不在乎这个解决方案是否好,你可以做任何你喜欢的事情

例如,如果你正在模拟一个停车场经理,他正试图通过决定哪些车辆去哪里来优化交通流,那么很明显,你不会希望个别车辆做出停车决定,否则这将完全违背你试图实现的目标。也许你会有一个管理器对象,将车辆对象放在停车场对象的停车位对象中,或者你会简化,让停车场“做出决定”。如果你只想模拟在一个公共停车场被动发生的事情,在那里司机们选择他们到达的第一个空闲空间,那么也许你会让汽车对象来做


与任何其他模型一样,您是从现实中抽象出来的,并且关注重要的元素,因此您需要确定这些元素是什么,以及您希望它们做什么,并相应地设计您的类。一旦您为您的特定应用程序找到了最佳模型,那么这些类实际上将自己编写

OOP是关于父子层次结构和多态性的,因此您可以在派生类中实现相同的函数

例如,类ParkingLot.park()可能意味着搜索任何可用的停车位,而当您需要更精确地定义停车位时,您可以获取ParkingLot的孩子-停车场,并选择最适合您需要的停车位(例如残疾人停车位)

然后,还可以使用双重分派来确定两个选定组件之间交互的特定行为

最后但并非最不重要的一点是,当你在推导中建立等级时,试着问自己一个问题(例如)

停车场是车辆还是有车辆

停车场是停车场还是有车辆

摩托车是车辆还是有车辆


等等。问自己这样的问题可以帮助你建立一个良好的对象层次结构。

OOP是关于父子层次结构和多态性的,因此你可以在派生类中实现相同的函数

例如,类ParkingLot.park()可能意味着搜索任何可用的停车位,而当您需要更精确地定义它时,您可以得到ParkingLot的孩子-
ParkingLot.parkVehicleAnywhere(const Vehicle& vehicle);
Vehicle.park(const ParkingSlot& slot);
ParkingSlot.parkVehicle(const Vehicle& vehicle);

class Motorcycle : public Vehicle;
class Car : public Vehicle;
foo(X &, Y &[, Z &...]);
foo(T &, Y const &);
T::foo(Y const &);