PDA

View Full Version : declaration صرف چند کلاس در یک فایل هدر



vahid-p
شنبه 15 اردیبهشت 1397, 23:46 عصر
کدی به زبان C++‎‎‎ میخونم که در هدر خیلی از فایلهاش یک کلاس رو به صورت کامل تشریح کرده (متدها وفیلدهاش) ولی بالاترش اومده چند تا کلاس دیگه هم تعریف کرده به این صورت:

class classA;
class classB;


class classC : public classD
{
public:
...


میخواستم بدونم علت اینکار چیه و چه امکانی رو به ما میده. یه جورایی این کلاس ها به نظر میاد به هم مرتبط هستن ولی رابطه parent-child با هم ندارن لزوما.

خیلی از سوالاتمو تونستم سرچ کنم، ولی این مورد هر چی سرچ میکردم تعریف چند کلاس در یک کلاس رو میگفت. اما این کلاس ها در حالی فقط تعریف شدن که در فایل های جداگانه وجود دارن و تشریح شدن

parvizwpf
یک شنبه 16 اردیبهشت 1397, 16:50 عصر
این مورد میگه شما از اطلاعات داخل اون کلاسهای بالا میخواهید در کلاس فعلی استفاده کنید. چیزی مثل include

vahid-p
دوشنبه 17 اردیبهشت 1397, 12:33 عصر
این مورد میگه شما از اطلاعات داخل اون کلاسهای بالا میخواهید در کلاس فعلی استفاده کنید. چیزی مثل include
ممنون، همین راهنمایی شما باعث شد بتونم سرچ کنم و گویا بهش میگن forward-declaration.

خیلیا گفتن forward-declaration از include بهتره ولی چیزی که من میبینم تعدادی include هست و تعدادی forward-declaration در یک فایل هدر (همشون هم کلاس هستن). پس لزوما یه تفاوتی باید باشه. یه لینک هم تو همین انجمن پیدا کردم http://barnamenevis.org/showthread.php?493157
هر چند بازم خوب خوب نفهمیدم. به هر حال ممنون از راهنماییتون

farhad_shiri_ex
دوشنبه 17 اردیبهشت 1397, 15:42 عصر
کدی به زبان C++‎‎‎‎ میخونم که در هدر خیلی از فایلهاش یک کلاس رو به صورت کامل تشریح کرده (متدها وفیلدهاش) ولی بالاترش اومده چند تا کلاس دیگه هم تعریف کرده به این صورت:

class classA;
class classB;


class classC : public classD
{
public:
...


میخواستم بدونم علت اینکار چیه و چه امکانی رو به ما میده. یه جورایی این کلاس ها به نظر میاد به هم مرتبط هستن ولی رابطه parent-child با هم ندارن لزوما.

خیلی از سوالاتمو تونستم سرچ کنم، ولی این مورد هر چی سرچ میکردم تعریف چند کلاس در یک کلاس رو میگفت. اما این کلاس ها در حالی فقط تعریف شدن که در فایل های جداگانه وجود دارن و تشریح شدن

با سلام خدمت دوست عزیزم آقا vahid البته شما استاد ما هستی جسارت نباشه!
اگر بخوام کلی بگم در زبان ++c شما می تونید قبل از استفاده از یک تابع prototype اون بنویسید و بعد در زمان مناسب اون تابع را تکمیل کنیم حالا تصور کنید می خواهید از یک کلاس یا از چندین کلاس با فضای نام های مناسب تو کلاسی که در حال نوشتن اون هستید بخواهید استفاده کنید ولی کلاس هایی که میخواهید استفاده کنید فقط در طراحی اولیه هستند مثلا در نمودار های uml برنامه تون هنوز اون را طراحی نکردید پس وجود خارجی ندارن و قاعدتا نمیتونید اون کلاس را include کنید حالا برای اینکه قبل از اینکه بتونید از اون استفاده کنید باید prototype کلاس را تعریف کنید و ازش استفاده کنید تا بعد کلاس را طراحی کنید و البته کاهش سرعت کامپایل هم هست که خودتون مطالب را قبلا مطالعه کردید ولی من خودم به شخصه تاثیری ندیدم بیشتر برای راحتی رابط ها و پیاده سازی کلاسها از این تکنیک استفاده میکنم..

vahid-p
سه شنبه 18 اردیبهشت 1397, 11:31 صبح
با سلام خدمت دوست عزیزم آقا vahid البته شما استاد ما هستی جسارت نباشه!
اگر بخوام کلی بگم در زبان ++c شما می تونید قبل از استفاده از یک تابع prototype اون بنویسید و بعد در زمان مناسب اون تابع را تکمیل کنیم حالا تصور کنید می خواهید از یک کلاس یا از چندین کلاس با فضای نام های مناسب تو کلاسی که در حال نوشتن اون هستید بخواهید استفاده کنید ولی کلاس هایی که میخواهید استفاده کنید فقط در طراحی اولیه هستند مثلا در نمودار های uml برنامه تون هنوز اون را طراحی نکردید پس وجود خارجی ندارن و قاعدتا نمیتونید اون کلاس را include کنید حالا برای اینکه قبل از اینکه بتونید از اون استفاده کنید باید prototype کلاس را تعریف کنید و ازش استفاده کنید تا بعد کلاس را طراحی کنید و البته کاهش سرعت کامپایل هم هست که خودتون مطالب را قبلا مطالعه کردید ولی من خودم به شخصه تاثیری ندیدم بیشتر برای راحتی رابط ها و پیاده سازی کلاسها از این تکنیک استفاده میکنم..
پس منظور شما اینه که ما میتونیم از متدها و فیلدهای تعریف شده در هدر این کلاس استفاده کنیم (اگر حتی هدر این کلاس هم نباشه از خود کلاس فقط میشه استفاده کرد) با اینکه این متدها هنوز هیچ بدنه ای ندارن. شبیه اینترفیس میشه با این تفاوت که میتونیم آبجکت جدید ازش بسازیم بدون پیاده سازی.

farhad_shiri_ex
سه شنبه 18 اردیبهشت 1397, 12:13 عصر
پس منظور شما اینه که ما میتونیم از متدها و فیلدهای تعریف شده در هدر این کلاس استفاده کنیم (اگر حتی هدر این کلاس هم نباشه از خود کلاس فقط میشه استفاده کرد) با اینکه این متدها هنوز هیچ بدنه ای ندارن. شبیه اینترفیس میشه با این تفاوت که میتونیم آبجکت جدید ازش بسازیم بدون پیاده سازی.

وقتی تو یک کلاس بخواهید متد دوست تعریف کنید و در اعلان تابع دوست یکی از آرگومان ها یک کلاس دیگه باشه از این روش استفاده میشه کرد.
#include <iostream>
using namespace std ;

class B ;

class A {
private :
int data;
public :
A() : data(4) { }
int friend ffunc(A , B);
};

class B {
private :
int data;
public :
B() : data(7) { }
int friend ffunc(A , B);
};

int ffunc(A a ,B b){
retrun(a.data + b.data);
};

و خوب حالا قبل از اینکه تابع دوست را پیاده سازی کنید باید کلاس B را پیاده سازی کنید حالا شاید بگید که خوب قبلش میام کلاس B را تعریف میکنم و بعد تو کلاس A فراخوانی میکنم بله درسته !
ولی این تکنیک زمانی کاربری داره که شما چند کلاس را تو یک فایل سورس سازماندهی میکنید. خوب باالطبع در این وضعیت فرقی نداره که اول کلاس A تعریف بشه ویا کلاس B چون در هر صورت باید قبل از استفاده هرکدوم از کلاسها اول تعریف بشن.