টেম্প্লেটেড সি ++ ক্লাস লেখার সময় আপনার কাছে সাধারণত তিনটি বিকল্প থাকে:
(1) শিরোনামে ঘোষণা এবং সংজ্ঞা রাখুন।
// foo.h
#pragma once
template <typename T>
struct Foo
{
void f()
{
...
}
};
অথবা
// foo.h
#pragma once
template <typename T>
struct Foo
{
void f();
};
template <typename T>
inline void Foo::f()
{
...
}
প্রো:
- খুব সুবিধাজনক ব্যবহার (কেবল শিরোনাম অন্তর্ভুক্ত)।
কন:
- ইন্টারফেস এবং পদ্ধতি বাস্তবায়ন মিশ্রিত হয়। এটি "কেবল" একটি পঠনযোগ্যতা সমস্যা problem কিছু এটি অনিবার্য মনে করে, কারণ এটি স্বাভাবিক .h / .cpp পদ্ধতির চেয়ে পৃথক। তবে, সচেতন হন যে অন্যান্য ভাষায় এটি কোনও সমস্যা নয়, উদাহরণস্বরূপ, সি # এবং জাভা।
- উচ্চ পুনর্নির্মাণের প্রভাব: আপনি
Foo
সদস্য হিসাবে নতুন ক্লাস ঘোষণা করলে আপনাকে অন্তর্ভুক্ত করা দরকার foo.h
। এর অর্থ Foo::f
হ্যাডার এবং উত্স ফাইল উভয়ের মাধ্যমে প্রচারগুলির বাস্তবায়ন পরিবর্তন করা।
পুনর্নির্মাণের প্রভাবটি ঘনিষ্ঠভাবে দেখে নেওয়া যাক: অ-পরীক্ষিত সি ++ ক্লাসের জন্য আপনি। এই পদ্ধতিতে, যখন কোনও পদ্ধতির বাস্তবায়ন পরিবর্তন করা হয়, কেবলমাত্র একটি .cpp পুনরায় সংযোগ করা প্রয়োজন। এটি। টেম্পলেট ক্লাসগুলির জন্য আলাদা হয় যদি .h এ আপনার সমস্ত কোড থাকে। নিম্নলিখিত উদাহরণটি একবার দেখুন:
// bar.h
#pragma once
#include "foo.h"
struct Bar
{
void b();
Foo<int> foo;
};
// bar.cpp
#include "bar.h"
void Bar::b()
{
foo.f();
}
// qux.h
#pragma once
#include "bar.h"
struct Qux
{
void q();
Bar bar;
}
// qux.cpp
#include "qux.h"
void Qux::q()
{
bar.b();
}
এখানে, শুধুমাত্র Foo::f
ভিতরে ব্যবহার করা হয় bar.cpp
। তবে, আপনি যদি Foo::f
উভয়টির বাস্তবায়ন পরিবর্তন করেন bar.cpp
এবং উভয়ই qux.cpp
পুনরায় সংযুক্ত করা দরকার। Foo::f
উভয় ফাইলে জীবন বাস্তবায়ন , যদিও কোনও অংশই Qux
সরাসরি কিছু ব্যবহার করে না Foo::f
। বড় প্রকল্পগুলির জন্য, এটি শীঘ্রই একটি সমস্যায় পরিণত হতে পারে।
(২) .hpp এবং সংজ্ঞা .tpp এ রাখুন এবং এটি .h এর মধ্যে অন্তর্ভুক্ত করুন।
// foo.h
#pragma once
template <typename T>
struct Foo
{
void f();
};
#include "foo.tpp"
// foo.tpp
#pragma once // not necessary if foo.h is the only one that includes this file
template <typename T>
inline void Foo::f()
{
...
}
প্রো:
- খুব সুবিধাজনক ব্যবহার (কেবল শিরোনাম অন্তর্ভুক্ত)।
- ইন্টারফেস এবং পদ্ধতির সংজ্ঞা পৃথক করা হয়।
কন:
- উচ্চ পুনর্নির্মাণ প্রভাব (একই (1) )।
এই সমাধানটি .h / .cpp এর মতো দুটি পৃথক ফাইলে ঘোষণা এবং পদ্ধতির সংজ্ঞা পৃথক করে। যাইহোক, এই পদ্ধতির (1) হিসাবে একই পুনর্নির্মাণ সমস্যা রয়েছে, কারণ শিরোনামটিতে সরাসরি পদ্ধতির সংজ্ঞা রয়েছে।
(3) .hpp এবং সংজ্ঞা .tpp মধ্যে রাখুন, কিন্তু .tpp মধ্যে অন্তর্ভুক্ত .h।
// foo.h
#pragma once
template <typename T>
struct Foo
{
void f();
};
// foo.tpp
#pragma once
template <typename T>
void Foo::f()
{
...
}
প্রো:
- .H / .cpp বিভাজনের মতো পুনর্নির্মাণের প্রভাব হ্রাস করে।
- ইন্টারফেস এবং পদ্ধতির সংজ্ঞা পৃথক করা হয়।
কন:
- অসুবিধাজনক ব্যবহার:
Foo
কোনও ক্লাসে সদস্য যুক্ত করার সময় Bar
আপনাকে foo.h
হেডারে অন্তর্ভুক্ত করতে হবে । আপনাকে কল যদি Foo::f
একটি .cpp, আপনি এছাড়াও অন্তর্ভুক্ত করা আছে foo.tpp
সেখানে।
এই পদ্ধতিটি পুনর্নির্মাণের প্রভাবকে হ্রাস করে, যেহেতু কেবলমাত্র .cpp ফাইলগুলি যা সত্যই ব্যবহার করে Foo::f
তা পুনরায় সংযুক্ত করা দরকার। তবে, এটি একটি মূল্যে আসে: এই সমস্ত ফাইলগুলিকে অন্তর্ভুক্ত করা দরকার foo.tpp
। উপর থেকে উদাহরণটি গ্রহণ করুন এবং নতুন পদ্ধতির ব্যবহার করুন:
// bar.h
#pragma once
#include "foo.h"
struct Bar
{
void b();
Foo<int> foo;
};
// bar.cpp
#include "bar.h"
#include "foo.tpp"
void Bar::b()
{
foo.f();
}
// qux.h
#pragma once
#include "bar.h"
struct Qux
{
void q();
Bar bar;
}
// qux.cpp
#include "qux.h"
void Qux::q()
{
bar.b();
}
যেহেতু আপনি দেখতে পারেন, শুধু পার্থক্য অতিরিক্ত এর অন্তর্ভুক্ত হয় foo.tpp
এ bar.cpp
। এটি অসুবিধাগুলি এবং ক্লাসের জন্য একটি সেকেন্ড যুক্ত করার উপর নির্ভর করে আপনি এটির পদ্ধতিগুলি কল করেন কিনা তা নির্ভর করে। তবে, আপনি পুনর্নির্মাণের প্রভাব হ্রাস করুন: bar.cpp
আপনি যদি এর বাস্তবায়ন পরিবর্তন করেন তবে কেবল পুনরায় সংযুক্ত করা দরকার Foo::f
। ফাইলটির qux.cpp
কোনও পুনঃসংশোধনের প্রয়োজন নেই।
সারসংক্ষেপ:
আপনি যদি কোনও লাইব্রেরি প্রয়োগ করেন তবে সাধারণত পুনর্নির্মাণের প্রভাব সম্পর্কে আপনার প্রয়োজন হয় না। আপনার লাইব্রেরির ব্যবহারকারীরা একটি রিলিজ পেয়েছে এবং এটি ব্যবহার করে এবং গ্রন্থাগার প্রয়োগের ব্যবহারকারীর দিনে দিনে কোনও পরিবর্তন হয় না। এই জাতীয় ক্ষেত্রে, গ্রন্থাগারটি পদ্ধতির (1) বা (2) ব্যবহার করতে পারে এবং এটি আপনি যেটি চয়ন করেন তা স্বাদের বিষয়।
তবে আপনি যদি কোনও অ্যাপ্লিকেশন নিয়ে কাজ করছেন বা আপনি যদি আপনার কোম্পানির অভ্যন্তরীণ লাইব্রেরিতে কাজ করছেন তবে কোডটি ঘন ঘন পরিবর্তিত হয়। সুতরাং আপনাকে পুনর্নির্মাণের প্রভাব সম্পর্কে যত্ন নিতে হবে। আপনি যদি আপনার বিকাশকারীদের অতিরিক্ত অন্তর্ভুক্ত গ্রহণ করতে পান তবে পদ্ধতির (3) পছন্দ করা একটি ভাল বিকল্প হতে পারে।