PDA

View Full Version : راهنمایی برای حل ارور



Northstar
سه شنبه 26 خرداد 1394, 00:01 صبح
سلام
من به تازگی شروع به یادگیری C++‎‎‎‎ کردم. برای تمرین خواستم که یک برنامه پسوردمنیجر رو بصورت شی گرا پیاده کنم اما زمانیکه در main می خوام یک نمونه از کلاس فرزند معرفی کنم ارور زیر رو میده:
variable ... has initializer but incomplete type
من این برنامه رو در لینوکس و با اکلیپس نوشتم وقتی که دقیقا همین کدها رو توی ویژوال استدیو نوشتم بدون مشکلی اجرا شد.
کلاس والد - فایل record.h:
#ifndef RECORD_H_
#define RECORD_H_
#include <iostream>

namespace s1 {
class record {
public:
record(std::string n);
record();
void setname(std::string n);
protected:
std::string name;
};
} /* namespace s1 */

#endif /* RECORD_H_ */

کلاس والد - فایل record.cpp:
#include "record.h"

namespace s1 {
record::record(std::string n){
name=n;
}

void record::setname(std::string n){
name=n;
}
} /* namespace s1 */


کلاس فرزند - فایل other.h:
#ifndef OTHER_H_
#define OTHER_H_
#include "record.h"

namespace s1 {
class other: protected record {
public:
other();
other(std::string n,std::string n2);
virtual ~other();
void setvalue(std::string n,std::string n2);
std::string getname();
std::string getnote();
private:
std::string note;
};
} /* namespace s1 */
#endif /* OTHER_H_ */


کلاس فرزند - فایل other.cpp:
#include "other.h"
using namespace std;

namespace s1 {
other::other (string n,string n2){
setname(n);
note=n2;
}

void other::setvalue(std::string n,std::string n2){
name=n;
note=n2;
}

other::~other() {
// TODO Auto-generated destructor stub
}

string other::getnote(){
return note;
}

string other::getname(){
return name;
}
} /* namespace s1 */


با تشکر

rahnema1
سه شنبه 26 خرداد 1394, 08:28 صبح
سلام
هنگامی که شما بخواهید یک شیء از نوع other ایجاد کنید لازمه اش اینه که یک شیء record هم درست بشه که این record داخل شیء other قرار می گیره
برای ایجاد record هم لازمه سازنده اش صدا زده بشه
حالا کدوم سازنده ی record باید صدا زده بشه؟
وقتی شما سازنده other را به این شکل بالا تعریف کنید و مشخص نکنید کدوم سازنده record صدا زده بشه، سازنده «پیش فرض» record انتخاب شده و صدا زده می شه.
سازنده پیش فرض سازنده ای هست که آرگومانی نداره
اما شما سازنده پیش فرض را اعلان کردید در فایل h اما در cpp تعریف نکردید به خاطر همین خطا صادر می شه
اگر کلاس record هیچ سازنده ای اعلان یا تعریف نشده بود یک سازنده پیش فرض توسط کامپایلر به طور اتوماتیک برای اون ایجاد می شد. اما در شرایط فعلی حتما لازمه تعریف بشه
که می تونید در فایل record.cpp اینجور بذارید:
record::record(){}
یا یک روش دیگه استفاده کنید که دیگه لازم نباشه تعریف داخل فایل cpp قرار بگیره کافیه در فایل record.h سازنده پیش فرض را به صورت زیر اعلان کنید
record()=default;
در این صورت هم به طور اتوماتیک، سازنده پیش فرض برای کلاس record تعریف می شه
اما می تونید هنگام ساختن شیء other مشخص کنید کدام سازنده کلاس record صدا زده بشه.به طوری که در کد زیر سازنده دیگری غیر از سازنده پیش فرض صدا زده می شه

other::other (string n,string n2):s1::record::record(n){
setname(n);
note=n2;
}

Northstar
پنج شنبه 28 خرداد 1394, 12:23 عصر
با تشکر از راهنمایی شما اون مشکل حل شد. اگه امکان داره منبعی برای آشنایی با namespace ها و هدرها معرفی کنید تقریبا تمام ارورهای من به این موضوع برمیگرده.
در مورد این ارور هم لطفا راهنمایی کنید: من می خوام با فایل کار کنم(خواندن و نوشتن) اما با وجود اضافه کردن include<fstream بازهم ارورهای زیر رو میده:
std::fstream mf(s,ios::out);
no matching function for call to ‘std::basic_fstream<char>::basic_fstream(std::string&, const openmode
در اینجا s یک استرینگ است که آدرس فایل در اون قرارداره(در صورتی که آدرس فایل بصورت مستقیم نوشته بشه بازهم ارور میده)

std::ofstream f();
f.open(s);

قسمت f.open ارور زیر را میده:
method open could not be resolved
با تشکر

rahnema1
پنج شنبه 28 خرداد 1394, 13:16 عصر
معمولا تو کتابهای آموزشی بخشی برای خواندن و نوشتن فایل اختصاص میدن
سایت cplusplus.com هم خوبه. در مورد فضای نام و انواع هدر ها هم منبه تقربا کاملیه
مثلا لینک زیر را ببنید:
http://www.cplusplus.com/doc/tutorial/files

Northstar
جمعه 29 خرداد 1394, 10:54 صبح
معمولا تو کتابهای آموزشی بخشی برای خواندن و نوشتن فایل اختصاص میدن
سایت cplusplus.com هم خوبه. در مورد فضای نام و انواع هدر ها هم منبه تقربا کاملیه
مثلا لینک زیر را ببنید:
http://www.cplusplus.com/doc/tutorial/files

با تشکر از پاسخ گویی سریع شما.
من هم این سایت و هم از چند کتاب دیگه بخصوص کتاب professional c++ wrox برای یادگیری استفاده می کنم. در مورد این ارور باید بگم که تمام راهکارهای موجود در کتاب و این سایت و چند سایت دیگه رو امتحان کردم اما بازهم ارور رفع نشده. آدم حالا راحتی کار با ویژوال استدیو و زبان هایی مثل سی شارپ رو درک میکنه.

zero_ox
جمعه 29 خرداد 1394, 12:04 عصر
با تشکر از راهنمایی شما اون مشکل حل شد. اگه امکان داره منبعی برای آشنایی با namespace ها و هدرها معرفی کنید تقریبا تمام ارورهای من به این موضوع برمیگرده.
در مورد این ارور هم لطفا راهنمایی کنید: من می خوام با فایل کار کنم(خواندن و نوشتن) اما با وجود اضافه کردن include<fstream بازهم ارورهای زیر رو میده:
std::fstream mf(s,ios::out);
no matching function for call to ‘std::basic_fstream<char>::basic_fstream(std::string&, const openmode
در اینجا s یک استرینگ است که آدرس فایل در اون قرارداره(در صورتی که آدرس فایل بصورت مستقیم نوشته بشه بازهم ارور میده)

std::ofstream f();
f.open(s);

قسمت f.open ارور زیر را میده:
method open could not be resolved
با تشکر


#include <iostream>
#include <fstream>
#include <string>
using namespace std;


int main()
{
string s="C:\\Test.txt";
ofstream f;
f.open(s,ios::out);
f<<"Hello World";
f.close();




return 0;
}

rahnema1
جمعه 29 خرداد 1394, 13:05 عصر
... اما بازهم ارور رفع نشده. آدم حالا راحتی کار با ویژوال استدیو و زبان هایی مثل سی شارپ رو درک میکنه.

شما می تونید از ++visual c استفاده کنید که امکانات خوبی هم داره
یه سوال آیا مثالهای اون سایت که گفتم را دقیقا کپی کردید و اجرا نمی شه؟ شاید از یک کامپایلر قدیمی دارید استفاده می کنید

Northstar
شنبه 30 خرداد 1394, 18:17 عصر
شما می تونید از ++visual c استفاده کنید که امکانات خوبی هم داره
یه سوال آیا مثالهای اون سایت که گفتم را دقیقا کپی کردید و اجرا نمی شه؟ شاید از یک کامپایلر قدیمی دارید استفاده می کنید
با تشکر از راهنمایی شما. بنا به دلایلی مجبور هستم که کار با لینوکس و سی پلاس رو یاد بگیرم اما نظر شخصیم بعد از حدود یک ماه استفاده از لینوکس این هست که دنیای مایکروسافت واقعا راحتتر از لینوکس و اپن سورس هست.
اما در مورد این ارور مشکل من حل شد دلیل این ارور و راه حل اون رو می نویسم برای دیگران:
تمام مثال های سایت cplusplus با یک رشته بصورت زیر هست:
ofstream myfile;
myfile.open ("example.txt");
اما وقتی برنامه نویس بخواد که اسم و آدرس فایل رو در یک استرینگ قرار بده و با اون کار کنه بدلیل اینکه سازنده و سایر توابع کار با فایل بصورت پیش فرض انتظار دریافت یک اشاره گر char دارند ممکن هست که برنامه ارور بده برای رفع ارور کافیه که از متد c_str استفاده کنیم به شکل زیر:

string s;
ofstream mf(s.c_str());