LINUX.ORG.RU

Нужно выбрать способ передачи значения между методами класса между «через аргумент» и «через член класса»

 ,


0

1

поделитесь опытом и соображениями применительно к плюсам. Тоесть прямее реализован class A или class B:

class A
{
    void M1(int x){ printf("%d\n", x); }
    void M2(){ M1(2); }
}

class B
{
    int x;

    void M1(){ printf("%d\n", x); }
    void M2(){ x = 2; M1(); }
}
★★★★★

А как это вообще понимать?

actics ()

Если только передать, то первое, конечно же.

const86 ★★★★★ ()

Вопрос некорректен, из серии «что прямее, a+b или a*b».

Всё зависит от того, является ли x свойством объекта.

slovazap ★★★★★ ()

Ответ не связан с конкретным языком программирования, в данном случае плюсами.

dave ★★★★★ ()

Помоему в В какой-то бред. Тут от задачи зависит. если это х больше нигде не используется, тогда получается какой-то страный вызов и памяти на каждый объект расходуется на инт больше

actics ()

Использовать лишний член класса исключительно для передачи аргумента довольно странная идея.

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

Помойму тоже но так как я не спец в плюсах то решил перестраховатся на тему подводных камней. Рефакторю старый код который насквозь реализован в стиле класса B :(((

cvv ★★★★★ ()

Если нужно только передать аргумент, то делать ему в членах класса нечего.

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

Как уже было сказано, тут вопрос не связан с языком :) Если ты не знаком с ООП, то тогда нужно точно почитать книжки

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

Ага. Ну что же, тебя ждет еще много сюрпризов. ☺

f1xmAn ★★★★★ ()

Пожалуй, вариант Б может пригодиться в том случае, если нам нужно по-бедному сэмулировать замыкание, но у такой эмуляции будет множество недостатков, да и речь, скорее всего, совсем не о том.

dave ★★★★★ ()

В данном «примере» только первое.

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

вы просто ничего не понимаете в ооп

Deleted ()

В вашем примере логично выбрать первый вариант, но...

Во-первых мне кажется, что ваш пример упрощен.

Во-вторых если тип x не int, а нечто более сложное, например класс, то это уже совсем другая история, т.к. при передаче по значению и при возврате из функции объект должен копироваться. Однако объект может «не уметь» копироваться.

Конечно можно передавать объект по ссылке, но эта ссылка все равно будет занимать место на стеке, а во втором примере всех этих манипуляций удается избежать, что особенно скажется если передавать объект нескольким функциям подряд.

Вообще же, я предполагаю, что код изначально кривой и автор таким образом «поборол» ошибки/предупреждения.

no-such-file ★★★★★ ()
Ответ на: комментарий от no-such-file

Конечно можно передавать объект по ссылке, но эта ссылка все равно будет занимать место на стеке, а во втором примере всех этих манипуляций удается избежать, что особенно скажется если передавать объект нескольким функциям подряд.

А можно расшифровать? Всегда считал, что ссылка на уровне ассемблера эквивалента передаче адреса. То есть, при вызове функции передается в стеке указатель и ничего более. А дальше дело компилятора си++ как трактовать.

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

То есть, при вызове функции передается в стеке указатель и ничего более

Именно об этом я и говорю. Указатель записывается на стек. Если функция вызывается, например, в цикле, то какой-никакой оверхед все-таки есть.

Но как я и отметил, маловероятно, что кто-то писал такой код как у ТС из-за этого.

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