LINUX.ORG.RU

В чём разница между main внутри класса или снаружи?

 ,


1

2
public class BasicSample : Object {

    public void run () {
        stdout.printf ("Hello World\n");
    }

    static int main (string[] args) {
        var sample = new BasicSample ();
        sample.run ();
        return 0;
    }
}

и

public class BasicSample : Object {

    public void run () {
        stdout.printf ("Hello World\n");
    }
}

static int main (string[] args) {
    var sample = new BasicSample ();
    sample.run ();
    return 0;
}

★★★

Последнее исправление: nvl (всего исправлений: 6)

В первом обьявляется класс с методом мейн. Во втором в методе мейн создаётся обьект апликейшн.

tyamur ★★
()
Ответ на: комментарий от tyamur

Вопрос в следующем. Второй вариант, я понимаю так:
объявляется класс, он наделяется методами и т.п., а в main выполняются методы экземпляра этого класса.

Не понятен первый вариант, как он работает. Т.е. Объявляется класс и все. Пример:

public class BasicSample : Object {

    public void run () {
        stdout.printf ("Hello World\n");
    }

    static int main (string[] args) {
        var sample = new BasicSample ();
        sample.run ();
        return 0;
    }
}
Почему main внутри класса?

nvl ★★★
() автор топика
Ответ на: комментарий от tyamur

Я понимаю, что можно. Разница есть? И если есть то в чем? Вот реальные два примера, обновил первое сообщение.

nvl ★★★
() автор топика
Ответ на: комментарий от nvl

Извиняюсь так нельзя это только для статик методов)

tyamur ★★
()

Это требование JVM. Фактически в Java не может существовать функций вне объектов.

xpahos ★★★★★
()

Первый вариант

/* 1.c generated by valac 0.36.7, the Vala compiler
 * generated from 1.vala, do not modify */


#include <glib.h>
#include <glib-object.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


#define TYPE_BASIC_SAMPLE (basic_sample_get_type ())
#define BASIC_SAMPLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_BASIC_SAMPLE, BasicSample))
#define BASIC_SAMPLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_BASIC_SAMPLE, BasicSampleClass))
#define IS_BASIC_SAMPLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_BASIC_SAMPLE))
#define IS_BASIC_SAMPLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_BASIC_SAMPLE))
#define BASIC_SAMPLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_BASIC_SAMPLE, BasicSampleClass))

typedef struct _BasicSample BasicSample;
typedef struct _BasicSampleClass BasicSampleClass;
typedef struct _BasicSamplePrivate BasicSamplePrivate;
#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))

struct _BasicSample {
	GObject parent_instance;
	BasicSamplePrivate * priv;
};

struct _BasicSampleClass {
	GObjectClass parent_class;
};


static gpointer basic_sample_parent_class = NULL;

GType basic_sample_get_type (void) G_GNUC_CONST;
enum  {
	BASIC_SAMPLE_0_PROPERTY
};
void basic_sample_run (BasicSample* self);
static gint basic_sample_main (gchar** args, int args_length1);
BasicSample* basic_sample_new (void);
BasicSample* basic_sample_construct (GType object_type);


void basic_sample_run (BasicSample* self) {
	FILE* _tmp0_;
	g_return_if_fail (self != NULL);
	_tmp0_ = stdout;
	fprintf (_tmp0_, "Hello World\n");
}


static gint basic_sample_main (gchar** args, int args_length1) {
	gint result = 0;
	BasicSample* sample = NULL;
	BasicSample* _tmp0_;
	_tmp0_ = basic_sample_new ();
	sample = _tmp0_;
	basic_sample_run (sample);
	result = 0;
	_g_object_unref0 (sample);
	return result;
}


int main (int argc, char ** argv) {
#if !GLIB_CHECK_VERSION (2,35,0)
	g_type_init ();
#endif
	return basic_sample_main (argv, argc);
}


BasicSample* basic_sample_construct (GType object_type) {
	BasicSample * self = NULL;
	self = (BasicSample*) g_object_new (object_type, NULL);
	return self;
}


BasicSample* basic_sample_new (void) {
	return basic_sample_construct (TYPE_BASIC_SAMPLE);
}


static void basic_sample_class_init (BasicSampleClass * klass) {
	basic_sample_parent_class = g_type_class_peek_parent (klass);
}


static void basic_sample_instance_init (BasicSample * self) {
}


GType basic_sample_get_type (void) {
	static volatile gsize basic_sample_type_id__volatile = 0;
	if (g_once_init_enter (&basic_sample_type_id__volatile)) {
		static const GTypeInfo g_define_type_info = { sizeof (BasicSampleClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) basic_sample_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (BasicSample), 0, (GInstanceInitFunc) basic_sample_instance_init, NULL };
		GType basic_sample_type_id;
		basic_sample_type_id = g_type_register_static (G_TYPE_OBJECT, "BasicSample", &g_define_type_info, 0);
		g_once_init_leave (&basic_sample_type_id__volatile, basic_sample_type_id);
	}
	return basic_sample_type_id__volatile;
}
Второй вариант
/* 2.c generated by valac 0.36.7, the Vala compiler
 * generated from 2.vala, do not modify */


#include <glib.h>
#include <glib-object.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


#define TYPE_BASIC_SAMPLE (basic_sample_get_type ())
#define BASIC_SAMPLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_BASIC_SAMPLE, BasicSample))
#define BASIC_SAMPLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_BASIC_SAMPLE, BasicSampleClass))
#define IS_BASIC_SAMPLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_BASIC_SAMPLE))
#define IS_BASIC_SAMPLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_BASIC_SAMPLE))
#define BASIC_SAMPLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_BASIC_SAMPLE, BasicSampleClass))

typedef struct _BasicSample BasicSample;
typedef struct _BasicSampleClass BasicSampleClass;
typedef struct _BasicSamplePrivate BasicSamplePrivate;
#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))

struct _BasicSample {
	GObject parent_instance;
	BasicSamplePrivate * priv;
};

struct _BasicSampleClass {
	GObjectClass parent_class;
};


static gpointer basic_sample_parent_class = NULL;

GType basic_sample_get_type (void) G_GNUC_CONST;
enum  {
	BASIC_SAMPLE_0_PROPERTY
};
void basic_sample_run (BasicSample* self);
BasicSample* basic_sample_new (void);
BasicSample* basic_sample_construct (GType object_type);
gint _vala_main (gchar** args, int args_length1);


void basic_sample_run (BasicSample* self) {
	FILE* _tmp0_;
	g_return_if_fail (self != NULL);
	_tmp0_ = stdout;
	fprintf (_tmp0_, "Hello World\n");
}


BasicSample* basic_sample_construct (GType object_type) {
	BasicSample * self = NULL;
	self = (BasicSample*) g_object_new (object_type, NULL);
	return self;
}


BasicSample* basic_sample_new (void) {
	return basic_sample_construct (TYPE_BASIC_SAMPLE);
}


static void basic_sample_class_init (BasicSampleClass * klass) {
	basic_sample_parent_class = g_type_class_peek_parent (klass);
}


static void basic_sample_instance_init (BasicSample * self) {
}


GType basic_sample_get_type (void) {
	static volatile gsize basic_sample_type_id__volatile = 0;
	if (g_once_init_enter (&basic_sample_type_id__volatile)) {
		static const GTypeInfo g_define_type_info = { sizeof (BasicSampleClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) basic_sample_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (BasicSample), 0, (GInstanceInitFunc) basic_sample_instance_init, NULL };
		GType basic_sample_type_id;
		basic_sample_type_id = g_type_register_static (G_TYPE_OBJECT, "BasicSample", &g_define_type_info, 0);
		g_once_init_leave (&basic_sample_type_id__volatile, basic_sample_type_id);
	}
	return basic_sample_type_id__volatile;
}


gint _vala_main (gchar** args, int args_length1) {
	gint result = 0;
	BasicSample* sample = NULL;
	BasicSample* _tmp0_;
	_tmp0_ = basic_sample_new ();
	sample = _tmp0_;
	basic_sample_run (sample);
	result = 0;
	_g_object_unref0 (sample);
	return result;
}


int main (int argc, char ** argv) {
#if !GLIB_CHECK_VERSION (2,35,0)
	g_type_init ();
#endif
	return _vala_main (argv, argc);
}
В код не вчитывался... Второй вариант на 37 байт меньше...

fsb4000 ★★★★★
()

В первом случае BasicSample служит условным неймспейсом для метода main. Не знаю C#, но рискну предположить что будет как в java. В первом случае ты сможешь обратится к приватным членам класса BasicSample из метода main:

public class BasicSample : Object {

    private void privateRun () {
        stdout.printf ("Hello World\n");
    }
    static int main (string[] args) {
        var sample = new BasicSample ();
        sample.privateRun ();
        return 0;
    }
}

Во втором случае ты так сделать не сможешь.

Aber ★★★★★
()
Ответ на: комментарий от Aber

ты сможешь обратится к приватным членам класса

Спасибо, хоть кто-то по теме ответил. Хотелось бы четко понимать в каких случаях предпочтителен тот или иной вариант. Может есть что-то еще?

nvl ★★★
() автор топика
Ответ на: комментарий от nvl

что блять значит в каких случаях. как язык требует так и делай. пиздец.

если это жава мейн вне класса не объявить если точка входа это функция мейн, то для статичных членов класса ака Application#main(int, char **) все-равно прийдется иметь где-то обертку пускалку вроде int main() { Application::main() }, все зависит от язка, рантайма, обстоятельств, какие правила ты тут услышать хочешь, какйрй иты язык вверху цитируешь и уверен ли ты что это так работает? если это шарп то на винфак дарагой/

anonymous
()
Ответ на: комментарий от anonymous

как язык требует так и делай

Вот как понять как язык требует? Конкретно Vala. В том коде, который я видел, видел и так и так. Примеры в первом сообщении компилируются один в один.

все зависит от язка, рантайма, обстоятельств, какие правила ты тут услышать хочешь

Добавил тег Vala. Какие обстаятельства могут повлиять? Еслиб я знал ответ, то смог бы сформулировать конкретнее, нов этом случае, я бы этот вопрос не задавал.

nvl ★★★
() автор топика
Ответ на: комментарий от nvl

пиздец значит и так и так позволяет и разницы нет - только синтаксический сахар (кто-то м ожет с ООП не знаком так что ему хеловорлд теперь не написать??) что за чекнутiе вопросы, что в доккументации по этому поводу пишут-то? выйди во дворе в пивнухе у мужиков спроси лучше чем на форуме. ну в самом деле, еще спроси в чем разница между

int number и int m_iNumber объявлениями и КАК ПРАВИЛЬНЕЕ

anonymous
()
Ответ на: комментарий от anonymous

так и так позволяет и разницы нет

Вот Aber один довод за первый вариант привел. Может еще есть какие-то особенности.

Все, иди в жопу, все равно ничего дельного от тебя нет.

nvl ★★★
() автор топика

как тебе привычно и удобно, так и делай. я изучал ООП на примере С++ и мне удобнее будет второй вариант. кто то возможно к джаве привык, ему первый вариант привычен будет. по факту кроме доступа из функции main к приватным методам класса (и защищённым методам родительских классов) разницы нет. а преимущество это сомнительное, не могу представить, когда это может пригодиться.

кроме того, почти никто из вышеотписавшихся ни строчки за всю жизнь не написали на vala, просто чтоб ты понимал.

небольшой хинт - запусти компилятор vala с опцией -C - он сгенерирует тебе код на C, который ты сможешь сравнить (например с помощью diff) с кодом, полученным от другого примера, если тебе настолько интересны детали

eternal_sorrow ★★★★★
()
Последнее исправление: eternal_sorrow (всего исправлений: 4)
Ответ на: комментарий от nvl

Этот довод «работает» и вне main/не main. Например что лучше, функция или метод?? Хм, метод имеет доступ к приватным мемберам класса, хм-хм, надо еще проанализировать.

anonymous
()
Ответ на: комментарий от eternal_sorrow

ни строчки за всю жизнь

Любой, кто писал свои г-объекты, или хотя бы юзал, прекрасно понимает, о чем речь. Как понимает и то, что эта валя это тупо их бойлерплейтер. Нагнал тут дешевой илитарности.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.