ورود

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 = "");