celestial_body.hpp
:
#pragma once
#include <raylib.h>
#include <memory>
#include <string>
class CelestialBodyBase {
public:
CelestialBodyBase(std::string name, double mass, double radius)
: name(name), mass(mass), radius(radius), position({0.0, 0.0, 0.0}) {}
virtual ~CelestialBodyBase() = default;
virtual void update() = 0;
protected:
std::string name;
double mass;
double radius;
Vector3 position;
};
template <class T>
class CelestialBody : public CelestialBodyBase {
public:
CelestialBody(std::string name, double mass, double radius)
: CelestialBodyBase(name, mass, radius) {}
void update() { derived()->update(); }
private:
T* derived() { return static_cast<T*>(this); }
};
planet.hpp
#pragma once
#include <starsystem/celestial_body.hpp>
class Planet : public CelestialBody<Planet> {
friend class CelestialBody<Planet>;
public:
Planet(std::string name, double mass, double radius);
~Planet();
void update();
};
planet.cpp
#include <starsystem/planet.hpp>
Planet::Planet(std::string name, double mass, double radius)
: CelestialBody(name, mass, radius) {}
Planet::~Planet() {}
void Planet::update() {
// Update planet
// ...
}
您可以看到,有一个构造函数,对于此处定义的所有3个类,基本上都是相同的。请注意,我有
CelestialBodyBase
类,使其与STL容器兼容。我有点希望我可以在例如基础中定义一个构造函数,而派生的类也继承了构造函数。模式看起来正确吗?
我有点希望我可以在例如基础中定义一个构造函数,而派生的类也继承了。
语法是
using Base::Base;
。 这将基本构造函数带入了当前范围。