PDA

View Full Version : تعریف کلاس و خطای multiply defined



md3848
دوشنبه 28 آبان 1397, 00:41 صبح
سلام
من یه کلاس دارم به صورت زیر :

#ifndef _TEST_H_
#define _TEST_H_

class test {
public :
}test1, test2, test3;


#endif


میخوام این کلاس ( که داخل فایل test.h هستش ) رو داخل یه فایل دیگه ( uart.h ) و فایل main استفاده کنم و فقط فایل رو include کنم و از شیء های از پیش تعریف شده استفاده کنم - مثلا از شیء test1 در فایل main استفاده کنم و از test2 در فایل uart.h ولی خطای زیر داده میشه بهم :


.\Objects\1.axf: Error: L6200E: Symbol test1 multiply defined (by uart.o and test.o).
.\Objects\1.axf: Error: L6200E: Symbol test2 multiply defined (by uart.o and test.o).
.\Objects\1.axf: Error: L6200E: Symbol test3 multiply defined (by uart.o and test.o).



برا حل این مورد تو فایل test.h اومدم اون object های از پیش تعریف شده رو static تعریف کردم که خب خطای فوق رفع شد ولی نمیدونم این کار درسته یا نه.

#ifndef _TEST_H_
#define _TEST_H_

class test {
public :
};

static test test1;
static test test2;
static test test3;

#endif

farhad_shiri_ex
دوشنبه 28 آبان 1397, 09:43 صبح
سلام
من یه کلاس دارم به صورت زیر :

#ifndef _TEST_H_
#define _TEST_H_

class test {
public :
}test1, test2, test3;


#endif


میخوام این کلاس ( که داخل فایل test.h هستش ) رو داخل یه فایل دیگه ( uart.h ) و فایل main استفاده کنم و فقط فایل رو include کنم و از شیء های از پیش تعریف شده استفاده کنم - مثلا از شیء test1 در فایل main استفاده کنم و از test2 در فایل uart.h ولی خطای زیر داده میشه بهم :


.\Objects\1.axf: Error: L6200E: Symbol test1 multiply defined (by uart.o and test.o).
.\Objects\1.axf: Error: L6200E: Symbol test2 multiply defined (by uart.o and test.o).
.\Objects\1.axf: Error: L6200E: Symbol test3 multiply defined (by uart.o and test.o).



برا حل این مورد تو فایل test.h اومدم اون object های از پیش تعریف شده رو static تعریف کردم که خب خطای فوق رفع شد ولی نمیدونم این کار درسته یا نه.

#ifndef _TEST_H_
#define _TEST_H_

class test {
public :
};

static test test1;
static test test2;
static test test3;

#endif


بخش اول دستورات که کلا خطای دستوری تلقی میشه یعنی نمی تونی تعریف چندگانه از کلاس داشته باشی! اگر هم که بحث مالکیت چندگانه از کلاس را می خواهید که اصلا راهش این نیست. البته نیازی هم به تعریف چندگانه نیست شما از روی یک کلاس می تونید آبجکتهای متمایز زیادی را ایجاد کنید.
برای بخش دوم هم استاتیک تعریف کردن یک کلاس کار اشتباهی نیست!
ولی اصلا توصیه نمیشه چون با این کار شما آبجکت ها را روی heap ذخیره میکنید که خوب حافظه heap هم محدودیت داره!
و نکته مهمتر این هست که زمانی که نیاز به استفاده از یک آبجکت داشتید می تونید اون را ایجاد کنید لازم نیست که آبجکت های استاتیک ایجاد کنید.
پس در زمان مناسب آبجکتها را تعریف کنید و استفاده کنید مثلا توی همون تابع main این کار را انجام بدید.

md3848
سه شنبه 29 آبان 1397, 12:59 عصر
خب من میخوام تو کلاسم ( کلاس test ) یه شیء تعریف کرده باشم و تو پروژه و فایل های دیگه از همون شی از پیش تعریف شده استفاده کنم و دیگه مجبور نشم تو دوتا فایل دوتا شیء جدا تعریف کنم

farhad_shiri_ex
سه شنبه 29 آبان 1397, 13:42 عصر
خب من میخوام تو کلاسم ( کلاس test ) یه شیء تعریف کرده باشم و تو پروژه و فایل های دیگه از همون شی از پیش تعریف شده استفاده کنم و دیگه مجبور نشم تو دوتا فایل دوتا شیء جدا تعریف کنم

اگر به یک شی یکتا unique نیاز داری بله استاتیک می تونی تعریف کنی و در کلاسهای دیگه ازش استفاده کنی!
اگر نه هریک از شی ها باید ماهیت جداگانه داشته باشند دیگه استاتیک فایده ای نداره باید یک کلاس Abstract factory درست کنی که بتونه از کلاس test برات شی ایجاد کنه و بعد هرجا که خواستی شی جدید ایجاد کنی کافی که به کلاس factory بگی برات ایجاد کنه اینطوری نیازی نیست هر بار از کلاس test شی ایجادکنی البته این روش هم خیلی بهینه است هم tight coupling هم تا حد زیادی کمتر کردید و البته خیلی هم maintainable از روشی هست که هربار بخواهی یک شی جدید از روی کلاس test ایجاد کنید

md3848
جمعه 09 آذر 1397, 00:17 صبح
بک مثال ( نمونه کد ساده ) میشه بزنید؟ چه کاریه یه فایل جدا برای ایجاد شیء ایجاد کنیم - چطوری میخواد این فایل کمک کنه؟:متفکر: این برنامه نویسی هم هرچی میری جلو میبینی دانسته هات داره کمتر میشه که:لبخند:

farhad_shiri_ex
جمعه 09 آذر 1397, 13:04 عصر
بک مثال ( نمونه کد ساده ) میشه بزنید؟ چه کاریه یه فایل جدا برای ایجاد شیء ایجاد کنیم - چطوری میخواد این فایل کمک کنه؟:متفکر: این برنامه نویسی هم هرچی میری جلو میبینی دانسته هات داره کمتر میشه که:لبخند:

پیشنهاد میکنم تو این سایت عضو شوید و به این مقاله ها هم یک نگاه بندازید خیلی از سوالات تون پاسخ داده میشه

http://bit.ly/2AxVVLO

md3848
چهارشنبه 14 آذر 1397, 11:21 صبح
انجمشو هم پس راه انداخت:لبخند::تشویق: - حله - آقا مممنون از شما ( این گزینه تشکر پست ها انگار حذف شده - برا من نمایش داده نمیشه - مرورگر اپرا )

farhad_shiri_ex
یک شنبه 18 آذر 1397, 10:52 صبح
انجمشو هم پس راه انداخت:لبخند::تشویق: - حله - آقا مممنون از شما ( این گزینه تشکر پست ها انگار حذف شده - برا من نمایش داده نمیشه - مرورگر اپرا )

خواهش میکنم !
کلید تشکر حذف نشده که! حذفش کردند!!! فکر کنم دیدن همون تشکر خشک و خالی هم اضافه است.
چه کاری اصلا این فرهنگ را که سالها براش زحمت کشیده بودن و جا انداخته بودن که حداقل میفهمیدیم چه کسانی ارزش دارند گه جوابشونو بدی وقت براشون بذاری و چه کسانی ندارند.!