View Full Version : مبتدی: خطا هنگام کامپایل
smemamian
یک شنبه 06 اسفند 1391, 23:06 عصر
سلام
test.h
#include <string>
#include <cstring>
#ifndef TEST_H
#define TEST_H
using namespace std;
class Test
{
private:
string name ;
public:
Test(string n);
void show();
void set();
};
#endif // TEST_H
test.cpp
#include <iostream>
#include "test.h"
using namespace std;
Test::Test(string n): name(n) {}
void Test::set()
{
cout << "plz enter name :\n" ;
getline(cin,name);
if(name.length() >= 25 )
name = name.substr(0,25);
}
void Test::show()
{
cout << "Your name : " << name << endl ;
}
main
#include <iostream>
#include "test.h"
using namespace std;
int main()
{
Test t1("Test"), t2 ;
t2.set();
t1.show();
t2.show();
return 0;
}
توی main خط 9 ارور میده :
/home/test/Documents/Test/Test/main.cpp:9: error: no matching function for call to 'Test::Test()'
aidinMC
یک شنبه 06 اسفند 1391, 23:24 عصر
آیا این کلاس شما از کلاس دیگه ای به ارث برده که سازندشو صدا زدی؟
Test::Test(string n): name(n) {}
و این که t2 رو به این شکل تعریف کن
test t2("")
یا حتما یه سازنده تعریف کن که پارامتر نگیره....
smemamian
یک شنبه 06 اسفند 1391, 23:43 عصر
این که :
Test::Test(string n): name(n) {}
مشکلی نداره ! مشکل از همون سازنده بود که باید تعریف می کردم :
Test::Test(): name("") {}
armintirand
یک شنبه 06 اسفند 1391, 23:43 عصر
آیا این کلاس شما از کلاس دیگه ای به ارث برده که سازندشو صدا زدی؟
Test::Test(string n): name(n) {}
و این که t2 رو به این شکل تعریف کن
test t2("")
یا حتما یه سازنده تعریف کن که پارامتر نگیره....
ایول سرعت عمل داشتم جواب میدادم دیدم پیشدستی فرمودین.:کف:
smemamian
یک شنبه 06 اسفند 1391, 23:45 عصر
مبتدی هستم یکم در مورد اشکال اول بگین منم متوجه بشم !
تشکر
aidinMC
یک شنبه 06 اسفند 1391, 23:46 عصر
مشکلی نداره ! مشکل از همون سازنده بود که باید تعریف می کردم :
Test::Test(): name("") {}
باید به این شکل تعریف کنی
Test::Test(): name() {}
armintirand
یک شنبه 06 اسفند 1391, 23:46 عصر
اشکال که نه ولی لزومی به استفاده از متغییر name وجود نداشت بدون اون هم میتونستید کارتون رو جلو ببرید
armintirand
یک شنبه 06 اسفند 1391, 23:47 عصر
بابا موشک بمب اتم انرژی هسته ای هر چی بگم کمه ایول به این سرعت
aidinMC
یک شنبه 06 اسفند 1391, 23:49 عصر
مبتدی هستم یکم در مورد اشکال اول بگین منم متوجه بشم !
تشکر
نه اشکال نیست اگه کلاسی به اسم name داشته باشی کد باید درست کار کنه
تو کد زیر بعد از ":" سازنده کلاسی فراخوانی میشه کلاس test ازش ارث برده شده ولی برای این که کد کامل بشه باید تعریف کلاس به شکل زیر تغییر کنه
class Test : public name
{
...
...
...
smemamian
یک شنبه 06 اسفند 1391, 23:50 عصر
حالا سوال !
تفاوت این 2 نوع سازنده چیه ؟
مثلا :
Test(): Var(value) {}
با :
Test()
{
Var = value ;
}
smemamian
یک شنبه 06 اسفند 1391, 23:53 عصر
نه اشکال نیست اگه کلاسی به اسم name داشته باشی کد باید درست کار کنه
من فقط همون کلاس Test رو دارم و هیچ چیز دیگه ای نیست و درست کار کرد :متفکر:
aidinMC
یک شنبه 06 اسفند 1391, 23:55 عصر
حالا سوال !
تفاوت این 2 نوع سازنده چیه ؟
مثلا :
Test(): Var(value) {}
با :
Test()
{
Var = value ;
}
این دوتا یه چیز نیست کلا با هم فرق میکنن
armintirand
یک شنبه 06 اسفند 1391, 23:56 عصر
توی اولی مقدار value توی var قرار میگیره اگه اشتباه نکنم
aidinMC
یک شنبه 06 اسفند 1391, 23:56 عصر
من فقط همون کلاس Test رو دارم و هیچ چیز دیگه ای نیست و درست کار کرد :متفکر:
بعضی کامپایلر ها نادیده میگیرن !
smemamian
دوشنبه 07 اسفند 1391, 00:01 صبح
این دوتا یه چیز نیست کلا با هم فرق میکنن
اولی مقدار دهی اولیه می کنه ولی دومی از انتساب استفاده می کنه .
smemamian
دوشنبه 07 اسفند 1391, 00:03 صبح
حالا از کدوم و کجا استفاده می شه ؟
لینکشو پیدا کردم کسی خلاصه میدونه ؟
http://www.parashift.com/c++-faq-lite/init-lists.html (http://www.parashift.com/c++-faq-lite/init-lists.html)
armintirand
دوشنبه 07 اسفند 1391, 00:03 صبح
اولی مقدار دهی اولیه می کنه ولی دومی از انتساب استفاده می کنه .
خوب اینم همونی شد که خدمتتون عرض کردم
armintirand
دوشنبه 07 اسفند 1391, 00:04 صبح
حالا از کدوم و کجا استفاده می شه ؟
لینکشو پیدا کردم کسی خلاصه میدونه ؟
http://www.parashift.com/c++-faq-lite/init-lists.html (http://www.parashift.com/c++-faq-lite/init-lists.html)
لینکتون باز نمیشه
smemamian
دوشنبه 07 اسفند 1391, 00:06 صبح
نمی دونم چرا باز نمیشه من از لینک زیر لینکشو پیدا کردم که پیشنهاد داده بودن :
http://stackoverflow.com/questions/5256330/what-is-the-difference-between-this-two-constructor
Read this FAQ : Should my constructors use "initialization lists" or "assignment"? (http://www.parashift.com/C++%E2%80%8E-faq-lite/ctors.html#faq-10.6)
mahak006
دوشنبه 07 اسفند 1391, 01:02 صبح
باید به این شکل تعریف کنی
Test::Test(): name() {}
نه اشکال نیست اگه کلاسی به اسم name داشته باشی کد باید درست کار کنه
تو کد زیر بعد از ":" سازنده کلاسی فراخوانی میشه کلاس test ازش ارث برده شده ولی برای این که کد کامل بشه باید تعریف کلاس به شکل زیر تغییر کنه
class Test : public name
{
...
...
...
حالا سوال !
تفاوت این 2 نوع سازنده چیه ؟
مثلا :
Test(): Var(value) {}
با :
Test()
{
Var = value ;
}
این دوتا یه چیز نیست کلا با هم فرق میکنن
البته شاید یه سوء تفاهمی شده باشه .
شما به این ترتیب هم می تونید به یه آبجکت کلاس ، مقدار بدید . همین طور بره پاس دادن آرگومان های تابع سازنده به سازنده ی کلاسی که ازش مشتق گرفتیم هم به کار می ره :
test(string Name,void *Parent,int x):
name(Name),parent(Parent),type(Parent,x)
{
...
}
تو مثال بالا که چندین بار ازش استفاده کردم ، name آبجکت کلاس هست که بهش رشته ی Name اختصاص داده می شه .parent و Parent که بهش داده می شه هم همین وضعیت رو دارن . اما type سازنده کلاسی هست که test مشتق اون کلاسه .
aidinMC
دوشنبه 07 اسفند 1391, 13:40 عصر
البته شاید یه سوء تفاهمی شده باشه .
شما به این ترتیب هم می تونید به یه آبجکت کلاس ، مقدار بدید . همین طور بره پاس دادن آرگومان های تابع سازنده به سازنده ی کلاسی که ازش مشتق گرفتیم هم به کار می ره :
test(string Name,void *Parent,int x):
name(Name),parent(Parent),type(Parent,x)
{
...
}
تو مثال بالا که چندین بار ازش استفاده کردم ، name آبجکت کلاس هست که بهش رشته ی Name اختصاص داده می شه .parent و Parent که بهش داده می شه هم همین وضعیت رو دارن . اما type سازنده کلاسی هست که test مشتق اون کلاسه .
شما هر متغییری رو به این شکل تو کلاس نمیتونی مقداردهی کنی ، درواقع شما فقط متغییرهای که از یک نوع خاص (کلاس) هستند و دارای تابع سازنده هستند میتونید به این شکل مقداردهی کنید.
اینجا هم چون name از نوع string هست ، در تعریف درواقع سازنده ش فراخوانی شده ، و من متغییر name رو ندیدم و فک کردم این کلاس از کلاسی به اسم name به ارث برده شده است....
mahak006
سه شنبه 08 اسفند 1391, 18:04 عصر
شما هر متغییری رو به این شکل تو کلاس نمیتونی مقداردهی کنی ، درواقع شما فقط متغییرهای که از یک نوع خاص (کلاس) هستند و دارای تابع سازنده هستند میتونید به این شکل مقداردهی کنید.
اینجا هم چون name از نوع string هست ، در تعریف درواقع سازنده ش فراخوانی شده ، و من متغییر name رو ندیدم و فک کردم این کلاس از کلاسی به اسم name به ارث برده شده است....
من تو Qt همون طور که گفتم ، متغیر از نوع void* رو هم همین طور دارم مقدار دهی اولیه می کنم . بالا هم نشون دادم .
Stanford
یک شنبه 13 اسفند 1391, 00:03 صبح
براحتی میتونید با کد زیر مشکل رو حل کنید:
تو test.h
Test(string n = "");
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.