c++ - tutorial - সি++ এ টাইপডফের ফরওয়ার্ড ঘোষণা




সি++ প্রোগ্রামিং বই (6)

"টাইপডফ ঘোষণা করার জন্য" আপনাকে একটি ক্লাস বা struct গঠন করতে হবে এবং তারপরে আপনি টাইপডফ ঘোষণা টাইপ করতে পারেন। একাধিক অভিন্ন typedefs কম্পাইলার দ্বারা গ্রহণযোগ্য।

দীর্ঘ ফর্ম:

class MyClass;
typedef MyClass myclass_t;

সংক্ষিপ্ত রূপ:

typedef class MyClass myclass_t;

কেন কম্পাইলার আমাকে একটি টাইপডফ ঘোষণা করা হবে না?

এটা অসম্ভব মনে হচ্ছে, আমার অন্তর্ভুক্তি গাছ ছোট রাখার জন্য সর্বোত্তম অনুশীলন কি?


@ বিলকটাসিয়াসের মতো, আমি উত্তরাধিকার ব্যবহার করি, এবং এটি আমার জন্য কাজ করে।

আমি এই জগাখিচুড়ি পরিবর্তন করেছি (যা আমার ঘোষণায় সব boost হেডার প্রয়োজন *। এইচ)

#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics.hpp>
#include <boost/accumulators/statistics/stats.hpp>
#include <boost/accumulators/statistics/mean.hpp>
#include <boost/accumulators/statistics/moment.hpp>
#include <boost/accumulators/statistics/min.hpp>
#include <boost/accumulators/statistics/max.hpp>

typedef boost::accumulators::accumulator_set<float,
 boost::accumulators::features<
  boost::accumulators::tag::median,
  boost::accumulators::tag::mean,
  boost::accumulators::tag::min,
  boost::accumulators::tag::max
 >> VanillaAccumulator_t ;
std::unique_ptr<VanillaAccumulator_t> acc;

এই ঘোষণায় (* .h)

class VanillaAccumulator;
std::unique_ptr<VanillaAccumulator> acc;

এবং বাস্তবায়ন (*। সিপিপি) ছিল

#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics.hpp>
#include <boost/accumulators/statistics/stats.hpp>
#include <boost/accumulators/statistics/mean.hpp>
#include <boost/accumulators/statistics/moment.hpp>
#include <boost/accumulators/statistics/min.hpp>
#include <boost/accumulators/statistics/max.hpp>

class VanillaAccumulator : public
  boost::accumulators::accumulator_set<float,
    boost::accumulators::features<
      boost::accumulators::tag::median,
      boost::accumulators::tag::mean,
      boost::accumulators::tag::min,
      boost::accumulators::tag::max
>>
{
};

আপনি টাইপডফ এগিয়ে করতে পারেন। কিন্তু করতে

typedef A B;

আপনাকে প্রথমে ঘোষণা করতে হবে A :

class A;

typedef A B;

আমারও একই সমস্যা ছিল, বিভিন্ন ফাইলগুলিতে একাধিক টাইপডফের সাথে জগাখিচুড়ি করতে চাইনি, তাই আমি উত্তরাধিকার দিয়ে এটি সমাধান করেছি:

ছিল:

class BurstBoss {

public:

    typedef std::pair<Ogre::ParticleSystem*, bool> ParticleSystem; // removed this with...

করেছিল:

class ParticleSystem : public std::pair<Ogre::ParticleSystem*, bool>
{

public:

    ParticleSystem(Ogre::ParticleSystem* system, bool enabled) : std::pair<Ogre::ParticleSystem*, bool>(system, enabled) {
    };
};

একটি কবজ মত কাজ। অবশ্যই, আমি থেকে কোনো রেফারেন্স পরিবর্তন ছিল

BurstBoss::ParticleSystem

সহজভাবে

ParticleSystem

বিল কটাসিয়াস উল্লেখ করেছেন যে, আপনার বিন্দু ব্যক্তিগতের টাইপডফের বিশদগুলি রাখার একমাত্র যুক্তিসঙ্গত উপায় এবং এগিয়ে যাওয়ার ঘোষণাটি তাদের উত্তরাধিকারসূত্রে রয়েছে। আপনি যদিও এটি C ++ 11 দিয়ে কিছুটা নিকৃষ্ট করতে পারেন। এই বিবেচনা:

// LibraryPublicHeader.h

class Implementation;

class Library
{
...
private:
    Implementation* impl;
};
// LibraryPrivateImplementation.cpp

// This annoyingly does not work:
//
//     typedef std::shared_ptr<Foo> Implementation;

// However this does, and is almost as good.
class Implementation : public std::shared_ptr<Foo>
{
public:
    // C++11 allows us to easily copy all the constructors.
    using shared_ptr::shared_ptr;
};

সম্পূর্ণ #include পরিবর্তে ফরওয়ার্ড ঘোষণাগুলি ব্যবহার করা শুধুমাত্র তখনই সম্ভব যখন আপনি নিজে (এই ফাইলের সুযোগে) ব্যবহার করতে ইচ্ছুক না হন তবে এটি একটি পয়েন্টার বা এটির রেফারেন্স।

টাইপ নিজেই ব্যবহার করার জন্য, কম্পাইলার অবশ্যই তার আকার জানতে হবে - সুতরাং পুরো ঘোষণাটি অবশ্যই দেখা উচিত - তাই একটি সম্পূর্ণ #include প্রয়োজন।

যাইহোক, পয়েন্টার বা রেফারেন্সের আকার কম্পাইলারের কাছে পরিচিত, কোনও পয়েন্টের আকার নির্বিশেষে, তাই একটি ফরওয়ার্ড ঘোষণা যথেষ্ট - এটি একটি টাইপ শনাক্তকারী নাম ঘোষণা করে।

আগ্রহজনকভাবে, পয়েন্টার বা class বা struct প্রকারের রেফারেন্স ব্যবহার করার সময়, কম্পাইলার পিনেটি প্রকারগুলিকে ঘোষণা করার জন্য আপনাকে প্রয়োজনীয় সঞ্চয়গুলি অপ্রত্যাশিতভাবে পরিচালনা করতে পারে:

// header.h

// Look Ma! No forward declarations!
typedef class A* APtr; // class A is an incomplete type - no fwd. decl. anywhere
typedef class A& ARef;

typedef struct B* BPtr; // struct B is an incomplete type - no fwd. decl. anywhere
typedef struct B& BRef;

// Using the name without the class/struct specifier requires fwd. decl. the type itself.    
class C;         // fwd. decl. type
typedef C* CPtr; // no class/struct specifier 
typedef C& CRef; // no class/struct specifier 

struct D;        // fwd. decl. type
typedef D* DPtr; // no class/struct specifier 
typedef D& DRef; // no class/struct specifier 




forward-declaration