انجمن‌های فارسی اوبونتو

کمک و پشتیبانی => برنامه‌سازی => نویسنده: parsibox در 15 آذر 1388، 07:50 ب‌ظ

عنوان: c++ و ایجاد فایل های هدر .h
ارسال شده توسط: parsibox در 15 آذر 1388، 07:50 ب‌ظ
 سلام
این فایل های .h چجوری ساخته میشن؟
من یه فایل c++ که مینویستم چجوری باید براش فایل .h بسازم؟
از netbeans استفاده میکنم
عنوان: پاسخ به: c++ و ایجاد فایل های هدر .h
ارسال شده توسط: iCEAGE در 15 آذر 1388، 11:13 ب‌ظ
تا اونجا که یادمه در سی پلاس پلاس، ما دارای یک سری فایل با پسوند h. هستیم که معمولا تعریف کلاس‌ها در این فایل‌ها قرار میگیره و  بدنه توابع کلاست در یک فایل مشابه اسم فایل h. با این تفاوت که پسوندش cpp. است، قرار می‌گیرد. خوب طبیعتا یک فایل main.cpp داری که میتونی اون فایل header رو include کنی و از اون در main شی بسازی و استفاده کنی.
در IDEهای مختلف وقتی یک پروژهٔ جدید درست می‌کنی بسته به نوع پروژه میتونه یک پروژه GUI باشه که طبیعتا یک سری فایل برای تو درست می‌کنه یا این که پروژهٔ خالی باشه که باید خودت به پروژت فایل اضافه کنی. اکثر IDEها برای اضافه کردن یک کلاس جدید یک ویزارد دارند که وقتی به وسیله اون ویزارد کلاس درست میکنی دو تا فایل برات درست میکنه که هم‌نام هستند اما با پسوندهای مختلف که یکی h. و دیگری cpp.
طبیعتا در netbeans هم دارای اینچنین فرآیندی هستید.
عنوان: پاسخ به: c++ و ایجاد فایل های هدر .h
ارسال شده توسط: parsibox در 15 آذر 1388، 11:25 ب‌ظ
یعنی محتویات داخل فایل .h را خود ide میسازه؟
یا اینکه خودم باید بنویسم؟
اگه باید خودم بنویسم چیا را باید بنویسم؟
توی ide باید چیا بزنم که بسازه؟
عنوان: پاسخ به: c++ و ایجاد فایل های هدر .h
ارسال شده توسط: gbmtoday در 15 آذر 1388، 11:53 ب‌ظ
۱ به نظر من برای شروع برنامه نویسی از netbeans یا eclipse استفاده نکنید و از gedit یا geany استفاده کنید.
 ۲ netbeans بصورت ‍‍پیش فرض c++ را support نمیکنه . و باید plug-in رو نصب کنید.
۳ FILE->New File بعد از قسمت سمت راست C++ و از قسمت سمت چپ C++ header File رو انتخاب کن . قسمت بعد هم اسم فایل و محلشو انتخاب می کنید ...

داخل فایل های .h معمولا اعلان تابع ها و کلاس ها نوشته می شود و داخل فایل های .cpp دستورات و کد تابع ها نوشته می شود

برای نمونه

Params.h
#ifndef __PARAMS__
#define __PARAMS__

#include <string>
#include <cstring>
#include <iostream>
#include <cstdlib>

class Params
{

std::string host ;

int port ;

std::string team_name ;

std::string robot_name ;

  public :

    Params () ;
static Params &instance();
void set_default_params () ;
bool check_params ( int ac , char *av[] ) ;
std::string get_host () ;
int get_port () ;
std::string get_team_name () ;
std::string get_robot_name () ;
};

#endif

Params.cpp

#include "Params.h"

Params::Params()
{
    set_default_params () ;
}

Params &Params::instance()
{
    static Params param;
    return param;
}


void Params::set_default_params ()
{
host = "127.0.0.1" ;
port = 10000 ;
team_name = "RoBoTooS" ;
robot_name = "SaEiD" ;
}

bool Params::check_params ( int ac , char *av[] )
{
for (int i = 1; i < ac; ++i)
    {
        if (strcmp(av[i], "--team") == 0)
            team_name = av[++i];
else if (strcmp(av[i], "--robot") == 0)
            robot_name = av[++i];
        else if (strcmp(av[i], "--host") == 0)
            host = av[++i];
        else if (strcmp(av[i], "--port") == 0)
            port = atoi(av[++i]);
        else
            std::cerr << "What?! \"" << av[i] << "\"?!! ;)" << std::endl;
    }

    return true;
}

std::string Params::get_host ()
{
return host ;
}

int Params::get_port ()
{
return port ;
}

std::string Params::get_team_name ()
{
return team_name ;
}

std::string Params::get_robot_name ()
{
return robot_name ;
}
عنوان: پاسخ به: c++ و ایجاد فایل های هدر .h
ارسال شده توسط: parsibox در 15 آذر 1388، 11:58 ب‌ظ
نقل‌قول
۱ به نظر من برای شروع برنامه نویسی از netbeans یا eclipse استفاده نکنید و از gedit یا geany استفاده کنید.

با کامپایل کردن پروژه در geany مشکل دارم.
نتبینز راحت تر gtk , glade , sqlite ,... را کامپایل میکنه.
نقل‌قول
۲ netbeans بصورت ‍‍پیش فرض c++ را support نمیکنه . و باید plug-in رو نصب کنید.

من ورژن فولش را دانلود کردم.همه چیزا ساپورت میکنه.

نقل‌قول
۳ FILE->New File بعد از قسمت سمت راست C++ و از قسمت سمت چپ C++ header File رو انتخاب کن . قسمت بعد هم اسم فایل و محلشو انتخاب می کنید ...
ممنون اینا تست میکنم.


عنوان: پاسخ به: c++ و ایجاد فایل های هدر .h
ارسال شده توسط: parsibox در 15 آذر 1388، 11:59 ب‌ظ
یه سوال دیگه هم داشتم.
کدی نیست که بشه داخل فیلد ها مستقیم خودش فارسی بنویسه؟
الان باید زبان سیستم را تغییر بدم و بزارم روی فارسی تا بتونم فارسی تایپ کنم.
توی c++ کد آماده ای نداریم؟
عنوان: پاسخ به: c++ و ایجاد فایل های هدر .h
ارسال شده توسط: gbmtoday در 16 آذر 1388، 05:04 ب‌ظ
Motvaje manzorton nmisham
( nmidonam chra Farsi m yho ghatide? )sry
عنوان: پاسخ به: c++ و ایجاد فایل های هدر .h
ارسال شده توسط: parsibox در 16 آذر 1388، 05:51 ب‌ظ
ببین من یه فرم درست کردم.
یه جا گذاشتم که اسم را وارد میکنند.
وقتی میخوام توی این فرم تایپ کنم در حالت عادی انگلیسی تایپ میشه مگر اینکه زبان سیستم عامل را روی فارسی بزارم تا بتونم توی فیلد اسم فارسی بنویسم.
حالا میخوام ببینم روشی هست که بشه توی این فیلد اسم در حالت عادی فارسی تایپ بشه و نیازی به تغییر زبان سیستم عامل نباشه؟
مثلا برو به این آدرس http://www.parscoders.com/registration
کامل که باز شد جلوی فیلد نام*: را ببین.
میتونی مستقیم توش فارسی تایپ کنی و با دکمه ای که جلوشه میتونی زبان را تغییر بدی.
الان متوجه شدی؟
تو c++ نمیشه این کار را کرد؟
عنوان: پاسخ به: c++ و ایجاد فایل های هدر .h
ارسال شده توسط: parsibox در 16 آذر 1388، 06:09 ب‌ظ
نقل‌قول
۳ FILE->New File بعد از قسمت سمت راست C++ و از قسمت سمت چپ C++ header File رو انتخاب کن . قسمت بعد هم اسم فایل و محلشو انتخاب می کنید ...
ببین اینا تست کردم.
این کار را که بلد بودم.
منظور من را متوجه نشدی.
  سوال من این هست:  IDE قدرت این را نداره که از روی فایل .cpp من یک فایل .h خودش بسازه؟
اگه میتونه بسازه چجوری باید اینکار را بکنم؟
مثلا شما فایل Params.cpp را به ide بدی و ide خودش برات فایل Params.h را بسازه.
عنوان: پاسخ به: c++ و ایجاد فایل های هدر .h
ارسال شده توسط: heresh در 16 آذر 1388، 08:19 ب‌ظ
فایل cpp. بهش بدی و فایل h. بگیری؟!
دقیقا می‌خوای چیکار کنی؟

ببین تو ++C کد برنامه‌ها رو با پسوند cpp. ذخیره می‌کنن و header یا سرفایل کلاس‌ها رو تو یه فایل جدا با پسوند h. ذخیره می‌کنن که شامل کلاس و پروتو تایپ‌های توابع عضو میشه و تعریف همه توابع عضو رو تو یه فایل جدا به همون اسم ولی با پسوند cpp. دخیره می‌کنن. میشه کل یه کلاس رو تو همون فایل main هم نوشت ولی برای پیروی از اصل ADT که تجرد داده بهش می‌گن سرفایل کلاس‌ها رو جدا می‌نویسن.
حالا اگه تو یه فایل داری که توش یه کلاس هست می‌تونی تعریف توابع رو خودت تو یه فایل جدا بذاری. نمونه سینتکسش رو هم دوستمون بالا گذاشته
عنوان: پاسخ به: c++ و ایجاد فایل های هدر .h
ارسال شده توسط: iCEAGE در 16 آذر 1388، 11:35 ب‌ظ
ببین من یه فرم درست کردم.
یه جا گذاشتم که اسم را وارد میکنند.
وقتی میخوام توی این فرم تایپ کنم در حالت عادی انگلیسی تایپ میشه مگر اینکه زبان سیستم عامل را روی فارسی بزارم تا بتونم توی فیلد اسم فارسی بنویسم.
حالا میخوام ببینم روشی هست که بشه توی این فیلد اسم در حالت عادی فارسی تایپ بشه و نیازی به تغییر زبان سیستم عامل نباشه؟
مثلا برو به این آدرس http://www.parscoders.com/registration
کامل که باز شد جلوی فیلد نام*: را ببین.
میتونی مستقیم توش فارسی تایپ کنی و با دکمه ای که جلوشه میتونی زبان را تغییر بدی.
الان متوجه شدی؟
تو c++ نمیشه این کار را کرد؟
در اونجا از جاوااسکریپت استفاده میشه که احتمالا وقتی کد یونیکد (یا شایدم اسکی) انگلیسی رو دریافت میکنه میگه اون رو تبدیل به کد یونیکد فارسی کن بعد اون رو تو textbox نشون بده (در واقع از رخداد presskey استفاده می‌کنه)
تو این برنامه‌ها هم میشه کاری شبیه به اونجا کرد مثلا وقتی که رخداد presskey اتفاق افتاد کد یونیکد (یا اسکی) انگلیسی رو به یونیکد فارسی تبدیل کرد.
اما به نظرم این کار منظقی نیست چون اگر کسی از زبان دیگری غیر از انگلیسی استفاده کند برنامهٔ شما غیرقابل استفاده می‌شود.
به نظرم کاربرا باید یاد بگیرند که صفحه کلید رو خودشون تغییر بدند و برنامه‌نویس هم باید از validate کردن فیلدها استفاده کنه
عنوان: پاسخ به: c++ و ایجاد فایل های هدر .h
ارسال شده توسط: parsibox در 17 آذر 1388، 07:17 ب‌ظ
دوست من توی ایران که یا فارسی مینوین یا انگلیسی.
غیر از این ۲ تا که نیست.
در ضمن من طرز عملکرد اون کد را نپرسیدم چون خودم جاوا اسکریپت بلد هستم و میدونم چیکار کردم.
من ۴ سال php کار کردم و کامل برنامه نویسی تحت وب بلد هستم.
من نمیخوام بشینم و چرخ را از اول اختراع کنم.سوال کردم که آیا چنین کدی برای cpp کسی نوشته؟
اگه قبلا نوشتن که منم استفاده کنم ولی اگه ننوشتن بشینم و برای برنامم بنویسم.
===========
فایل .h را هم برای این میخوام :
همون طور که خودت گفتی من کل برنامم را توی ۱ فایل نوشتم ولی حالا میخوام قسمت های مختلف را جدا کنم و فقط در فایل اصلی include کنم.
ولی تا اونجایی که من فهمیدم برای include کردن حتما باید فایل  .h بهش بدم و بعد فایل .cpp را خودش باز میکنه.
نمیدونم درست متوجه شدم یا نه.درست فهمیدم؟
حالا میخوام ببینم ide نمیتونه از روی فایل .cpp من یک فایل .h بسازه؟
عنوان: پاسخ به: c++ و ایجاد فایل های هدر .h
ارسال شده توسط: gbmtoday در 17 آذر 1388، 07:43 ب‌ظ

ولی تا اونجایی که من فهمیدم برای include کردن حتما باید فایل  .h بهش بدم و بعد فایل .cpp را خودش باز میکنه.

دوست عزیز اشتباه اه عرضتون رسوندن....
هیچ الزامی نیست که حتما فایل .h رو include کنی فایل .cpp رو هم میشه include کرد ...
و هیچ وقت فایل .h اتوماتیک فایل .cpp رو include نمیکنه مگر اینکه خودت بهش گفته باشی ...


حالا میخوام ببینم ide نمیتونه از روی فایل .cpp من یک فایل .h بسازه؟

من که نه همچین چیزی دیدم نه شنیدم ....

فک نکنم 4 خط کد ارزش این کارا رو داشته باشه ... برای هر تابع فقط یک خط ... فک نکنم زحمتی داشته باشه
عنوان: پاسخ به: c++ و ایجاد فایل های هدر .h
ارسال شده توسط: parsibox در 17 آذر 1388، 08:57 ب‌ظ
آهان
پس اینا ببین

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <gtk/gtk.h>
#include <glade/glade.h>
#include <sqlite3.h>
#include"tarikh_farsi.h"

من فقط اینا را گذاشتم
و داخل فایل  tarikh_farsi.h هم اینا را گذاشتم :
/*
 * File:   tarikh_farsi.h
 * Author: mohsen
 *
 * Created on December 7, 2009, 2:07 AM
 */

#ifndef _TARIKH_FARSI_H
#define _TARIKH_FARSI_H



#endif /* _TARIKH_FARSI_H */


ولی از تابع تاریخ فارسی که در فایل tarikh_farsi.cpp گذاشتم دارم توی برنامم استفاده میکنم!!!!!
هیچ جای برنامم هم فایل tarikh_farsi.cpp  را اینکلود نکردم
یعنی الان چجوری برنامم داره از این فایل استفاده میکنه؟
عنوان: پاسخ به: c++ و ایجاد فایل های هدر .h
ارسال شده توسط: gbmtoday در 17 آذر 1388، 11:56 ب‌ظ
الان شما داخل این فایل tarikh_farsi.h هیچ کار خاصی نکردی ... هیچی
معمولا داخل فایل ها .h کلاس تعریف می کنن و اعلان متد ها (‌تابع ها ) رو می  نویسند اما این فایل .h شما بی مصرف و هیچ کاربردی نداره ...
اصلا هم لازم نیست include کنیش...

اون تابع هم که امکان نداره همچین چیزی ... شما حتما یه جایی یه جوری اون فایلی که تابع داخلش تعریف شده رو include کردی ...
عنوان: پاسخ به: c++ و ایجاد فایل های هدر .h
ارسال شده توسط: parsibox در 18 آذر 1388، 12:00 ق‌ظ
من که کل include هایی که کردم را برات گذاشتم
هیچ کار دیگه ای هم نکردم
این فایل.h هم که ساختم همین جور زدم که تست کنم.
ولی وقتی فایل tarikh_farsi.h را اینکلود نکنم کار نمیکنه
عنوان: پاسخ به: c++ و ایجاد فایل های هدر .h
ارسال شده توسط: gbmtoday در 18 آذر 1388، 12:49 ق‌ظ
والا چی بگم ...

من خودم که ۲ ساله c++ زندگیمه تا حالا همچین چیزی ندیده بودم ... و هنوزم از نظر من این غیر ممکنه ...

دیگه نمیدونم ...  :-X

این فایل tarikh_farsi.h رو کجا include کردی ؟‌؟
عنوان: پاسخ به: c++ و ایجاد فایل های هدر .h
ارسال شده توسط: parsibox در 18 آذر 1388، 12:52 ق‌ظ
بالای فایل main.cpp
عنوان: پاسخ به: c++ و ایجاد فایل های هدر .h
ارسال شده توسط: gbmtoday در 18 آذر 1388، 01:35 ب‌ظ
یعنی وقتی خط
#include "tarikh_farsi.h"رو بر میداری error میده ؟؟؟‌

عجب  ??? :o والا تا جایی ک من می دونم این همچین چیزی نمیشه ... حالا شاید بقیه دوستان بدونن چه خبره
عنوان: پاسخ به: c++ و ایجاد فایل های هدر .h
ارسال شده توسط: heresh در 18 آذر 1388، 01:58 ب‌ظ
با چی کامپایلش می‌کنی؟

نقل‌قول
ولی وقتی فایل tarikh_farsi.h را اینکلود نکنم کار نمیکنه
کار نمی‌کنه یعنی چه پیام خطایی می‌ده؟
عنوان: پاسخ به: c++ و ایجاد فایل های هدر .h
ارسال شده توسط: parsibox در 18 آذر 1388، 02:01 ب‌ظ
درست شد فهمیدم چیا را باید توی هدر بزارم.
اونایی که توی هدر باید میزاشتم را توی فایل main.cpp گذاشته بودم.
عنوان: پاسخ به: c++ و ایجاد فایل های هدر .h
ارسال شده توسط: parsibox در 18 آذر 1388، 02:03 ب‌ظ
main.cpp:182: error: ‘Date’ was not declared in this scope
main.cpp:182: error: expected ‘;’ before ‘a’
main.cpp:183: error: ‘a’ was not declared in this scope
main.cpp:186: error: ‘b’ was not declared in this scope
main.cpp:186: error: ‘gregorian_to_jalali’ was not declared in this scope
عنوان: پاسخ به: c++ و ایجاد فایل های هدر .h
ارسال شده توسط: heresh در 18 آذر 1388، 02:27 ب‌ظ
به نظر من هم بود و نبود فایل tarikh_farsi.h نباید هیچ پیام خطایی بده چون توش هیچی نیست!
فایل main.cpp رو بزاری شاید بشه دید که چیکار کردی، البته اگه open source
عنوان: پاسخ به: c++ و ایجاد فایل های هدر .h
ارسال شده توسط: parsibox در 18 آذر 1388، 03:11 ب‌ظ
الان تقریبا میدونم چرا این ارور را میده.
چون توی همون main.cpp هم از یکی از متغیر هایی که در  tarikh_farsi.h  گذاشتم استفاده کردم.

void on_set_tarikh_clicked ( GtkWidget *widget, gpointer user_data ){
    GtkWidget *entry_tarikh;

    entry_tarikh = glade_xml_get_widget (gxml_moshtarak, "entry_tarikh");
time_t timestamp;
    timestamp = time(NULL);

    struct tm *rtime = localtime(&timestamp);
Date a,b;
a.dd=rtime->tm_mday;
a.mm=rtime->tm_mon;
a.yy= rtime->tm_year+1900;
b=gregorian_to_jalali(a);
        gtk_entry_set_text(GTK_ENTRY(entry_tarikh) , g_strdup_printf("%d - %d - %d", b.yy , b.mm , b.dd ));
}

حالا در نهایت یعنی اصلا نیازی به include کردنم نداره؟
من میتونم بدون include کردن از کدهایی که در یک فایل cpp نوشتم استفاده کنم؟
عنوان: پاسخ به: c++ و ایجاد فایل های هدر .h
ارسال شده توسط: gbmtoday در 18 آذر 1388، 03:47 ب‌ظ
این Date کجا تعریف شده ؟!!

نه دوست عزیز ... کامپایلر بیچاره از کجا بفهمه که شما می خوای از چه فایلی استفاده کنی ؟؟

باید حتما اون فایل .cpp رو که می خوای از محتویاتش استفاده کنی رو include کنی
عنوان: پاسخ به: c++ و ایجاد فایل های هدر .h
ارسال شده توسط: parsibox در 18 آذر 1388، 03:51 ب‌ظ
درستش کردم.اینا را منتقل کردم به فایل main.h
دیگه خودم دارم فایل های .h را میسازم.
این ide  ها هیچ کاری بلد نیستند انجام بدند!
عنوان: پاسخ به: c++ و ایجاد فایل های هدر .h
ارسال شده توسط: iCEAGE در 18 آذر 1388، 10:08 ب‌ظ
دوست من توی ایران که یا فارسی مینوین یا انگلیسی.
غیر از این ۲ تا که نیست.
در ضمن من طرز عملکرد اون کد را نپرسیدم چون خودم جاوا اسکریپت بلد هستم و میدونم چیکار کردم.
من ۴ سال php کار کردم و کامل برنامه نویسی تحت وب بلد هستم.
من نمیخوام بشینم و چرخ را از اول اختراع کنم.سوال کردم که آیا چنین کدی برای cpp کسی نوشته؟
اگه قبلا نوشتن که منم استفاده کنم ولی اگه ننوشتن بشینم و برای برنامم بنویسم.
===========
فایل .h را هم برای این میخوام :
همون طور که خودت گفتی من کل برنامم را توی ۱ فایل نوشتم ولی حالا میخوام قسمت های مختلف را جدا کنم و فقط در فایل اصلی include کنم.
ولی تا اونجایی که من فهمیدم برای include کردن حتما باید فایل  .h بهش بدم و بعد فایل .cpp را خودش باز میکنه.
نمیدونم درست متوجه شدم یا نه.درست فهمیدم؟
حالا میخوام ببینم ide نمیتونه از روی فایل .cpp من یک فایل .h بسازه؟
فکر می‌کنم یتونی برای جدا کردن تعریف‌ها از بدنهٔ توابع از refactoring استفاده کنی. کار سختی نباید باشه. کسی که ۴ ساله php کار میکنه حتما refactoring رو یاد داره :دی
http://en.wikipedia.org/wiki/Code_refactoring