C++ CRTP模式,构造函数定义

问题描述 投票:0回答:1
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;

。 这将基本构造函数带入了当前范围。
c++ oop crtp
1个回答
0
投票

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.