LINUX.ORG.RU

Стиль или как правильно

 ,


0

2

Здравствуйте. Какой способ получения контейнера из класса предпочтительнее для каждого из вариантов списка:

  • по значению;
  • без копирования, с возможностью редактирования полученного контейнера;
  • без копирования и без возможности редактирования.
#ifndef MYCLASS_H
#define MYCLASS_H

#include <vector>

class MyClass
{
public:
    MyClass();
    std::vector<int> getVec0();
    std::vector<int> &getVec1();
    const std::vector<int> &getVec2();
    void getVec3(std::vector<int>::iterator &itBeg, std::vector<int>::iterator &itEnd);
    void getVec4(std::vector<int>::const_iterator &itBeg, std::vector<int>::const_iterator &itEnd);
    void getVec5(std::vector<int> &vec);
    void getVec6(std::vector<int> *vec);

private:
    std::vector<int> myVec;
};

#endif // MYCLASS_H

И ещё вопросик, насколько допустимо объявление структур и функций не являющихся членами класса в *.h, но используемых в реализации функций-членов в *.cpp? Например, есть у меня обёртка для функций boost::spirit, заголовочные файлы и структуры, определяющие грамматики, объявлены только в parser.cpp и никак не фигурируют в parser.h.

/* parser.h */
//...
class MyParser
{
public:
    void getMyCon(string str, vector<int>::const_iterartor &itBegin, vector<int>::const_iterator &itEnd);
private:
    vector<int> myCon;
};
//...
/* parser.cpp */
#include "myparser.h"
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
//...

void foo(vector<int> &vec, int val)
{
    //...
}

template <typename Iterator>
struct MyGrammar
        : qi::grammar<Iterator, vector<int>(), qi::space_type>
{
    //...
};

void MyParser::getMyCon(string str, vector<int>::const_iterartor &itBegin, vector<int>::const_iterator &itEnd)
{
    //...
}


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

astyle -std=ansi ./* и не парься.

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

А ты гляди на этого обсоска.

Смотри сюда: Стиль или как правильно (комментарий) Потом смотри сюда Стиль или как правильно (комментарий)

Конкретно сюда:

для начала весь код целиком привести, и сказать, чего ты хочешь, придурок.

Т.е. питушара просто не следит за темой, просто балаболит, просто несёт херню ради того, чтобы нести херню. Т.е. его методика балабольства очень проста: Он заходит в тему и начинает нести херню, если это какой-то идиот - он с ним будет страться, нести херню в попытках свести тему к демагогии и срачу.

Это неначто неспособная жалкая макака, которая балаболит на лоре лишь для самоудовлетворения(т.е. попытка доказать себе, что он не ничтожество обоссанное, ниначтонеспособное, а что он что-то тут понимает, знает, может) - причем он реально верит в том, что он на что-то способен.

А теперь внимание вопрос - почему я с этим говно должен вести себя нормально? Причем это уже 10-20-я тема в которой он несёт херню, а потом сливается как животное. Первые 5-10раз я говорил с ним нормально - теперь мне покласть и я говорю с ним только для того, чтобы поставить питуха на место. Ведь нулёвые пацаны реально верят ему, а мне не нравится когда питухи нулёвых пацанов вгоняют в говно.

Это как показательная порка, чтобы каждый в треде знал и видел, что макака: а) тупая, б) за свои слова не отвечат, б) просто балаболить. Я делаю за вас то, что должны делать вы.

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

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

Слушай, а не ты ли тот студент-ущербан, который 0.3% лабы на фпгашке «сделал» и бахвалился тем, что он выжал 20гигафлопс на готовых «фпушках»? Кукарекая при этом, что обосссал х86 в 10000раз? А потом слился и обосрался и вёл себя как этот питух емулек.

Кстати, давай - выкатывай свой код и бенчи - я тебя тут тоже за компанию обоссу.

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

подмойся.

Хорошая идея - вперёд.

тебе не понять.

Скорее ты о5 обосрался и пытаешься съехать на тебе непонять. Как обычный обоссанный питух.

для начала весь код целиком привести, и сказать, чего ты хочешь, придурок.

Питуша, а когда ты тут(Стиль или как правильно (комментарий)) кукарекал - тыж для чего-то кукарекал или просто так?

Там тебе код целиком, тыж кукарекал, что он говно и operator=() Спасёт и как-то сделает не говном и как-то защитит от говна - вперёд, питух. Объясняй почему кукарекал, как надо и от чего и как спасёт.

Не сможешь, а именно поэтому ты о5 обосрался.

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

Гг, не, я тебе вообще ничего не доказывал, и не буду.

за компанию обоссу

давно у вас недержание?

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

Ответь мне на вопрос, на который ты когда кукарекал не ответил - сколько х86 сейчас «выдаёт» гигфлопс, где флопс - float. В прошлый раз ты обоссался, так и не ответив.

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

Гг, не, я тебе вообще ничего не доказывал, и не буду.

Дак я не ошибся, хотя Царь не ошибается. Молодец ты хоть следил за мной, твой пукан помнит.

Нет, ты начал кукарекать «ко-ко-ко я хреначу и сливаю в 10000раз х86 - я крут, а ты говно». Потом ты кукарекал «я не хвалюсь и непонтуюсь», хотя ты явно понтовался. Потом ты так и не смог объяснить как и почему и что ты там в 10000раз сливаешь. Так и не осилил посчитать сколько ты там реально считаешь, при этом кукарекал так же, как птиух емулек - «тебе не понять».

Когда понял, что обосрался - начал балаболить и сливаться на теоретическую производительность готовых «фпушек» для фпга, которое ты в жизни не напишешь. При этом даже не представляя что и как может х86.

Потом начал кукарекать «сколько там длинна конвейра в кукурузнике», который протух лет 15назад. При этом даже нихрена в х86 не понимая и твоя длинна «конвейера» - миф соседей по парте.

Потом тотально слился и меня забанили. Давай продолжим разговор я тебе хоть расскажу про х86, что он может и ты возможно, ели будешь пытаться понять, поймёшь какое говно ты несёшь и несёшь. И почему ты на днище и почему ты ничто.

Авось станешь на правильный путь и хоть что-то в этом мире будешь понимать. И будешь со мной спорить/сбегать не от бессильной анскильности, а попацаночке и на скилле.

Я тебе дал шанс - выбирай.

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

А, и тебя питуха я помню. Яж тебя обоссал в какой-то темке alv про какие-то там массивы или что ему там нужно было. У пебя пукан неслабо полыхал, да.

Тыж там кукарекал про «локальность», «Обходы» и прочее, обосравшись и слившись и не отвечая на вопросы. То-то ты питух явно что-то знаешь. Я даже какую-то епичность про «непрерывные адреса» кукарекал. Найди ту темку - я хоть поржу.

Давай и с тобой, питушком, я поспорю. Выкатывай тему.

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

Т.е. ты в очередной раз обоссался? Ну, ищи тему - пруфцы приводи.

Давай второй раз поспорим - выкатывай что и как считает твоё говно. Обоссу, выкачу, поделю на ноль. Обоссышься и ты это понимаешь, поэтомы ты уже не такйо борзый как раньше.

Я дал тебе шанс.

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

Это неначто неспособная жалкая макака, которая балаболит на лоре лишь для самоудовлетворения(т.е. попытка доказать себе, что он не ничтожество обоссанное, ниначтонеспособное, а что он что-то тут понимает, знает, может) - причем он реально верит в том, что он на что-то способен.

ну вот где-то тут ты и палишься. Суть в том, что я никому ничего не доказываю. Вот понимаешь? Мне просто пофиг, что ты там подумаешь, и какое твоё будет сраное мнение.

Но ты почему-то думаешь, что свои посты я пишу в расчёте на то, что ты меня возьмёшь себе рабом, и я буду выполнять какие-то твои задания за какие-то твои подачки.

Это любопытно, и интересно. Вплоть до того, что можно и подыграть...

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

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

Судя по вашим постам, эту фразу вам говорят каждый раз, когда вы открываете свой грязный ротик.

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

Ананимус, почему такой агрессиный? Или это твой способ сублимации?

На жизнь он обиженный. Впрочем, иногда это говно бывает смешно.

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

ибо я - Царь, а они говно.

Как там Наполеон, жив еще?

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

Ответь мне на вопрос, на который ты когда кукарекал не ответил - сколько х86 сейчас «выдаёт» гигфлопс, где флопс - float. В прошлый раз ты обоссался, так и не ответив.

мудило: flops это float point per sec. вот тебе здесь читать: http://en.wikipedia.org/wiki/FLOPS

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

Дак я не ошибся, хотя Царь не ошибается.

/me в своей красной книжке сделал правку:

не ошибаются только мудаки не ошибаются только Царь и мудаки.

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

Потом тотально слился и меня забанили

а потом ты ВНЕЗАПНО узнал, что можно даже без регистрации читать? И даже срать...

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

Давай, озвучь. Мне из медицинских соображений интересно.

мне тоже интересно, но похоже не взлетит. Эта лолка замкнута сама на себя.

emulek
()

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

тс-у.

1. если метод класса возвращает контейнер — сотри этот класс и напиши заново правильный.

2. у ключевого слова static в крестах целых 3 значения. энтропия во вселенной и без тебя увеличивается, так что заменяй одно из этих значений на анонимные пространства имён.

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

странный какой-то класс. вы свой контейнер лепите?

1. зачем?

2. в stl есть куча примеров годных интерфейсов для этого случая.

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

Радует, когда идиота видно сразу с первых фраз.

1. Сраный геттер, как я уже сказал, это единственный случай, когда имеет смысл возвращать ссылку.

2. Ты не думал, что тебе стоит писать код в более читабельной манере?

3.

Это говно. Если ты хочешь дубликат в куче - это делается так:

Тебе кто-то говорил, что я хочу делать дубликат в куче? Да так делают только идиоты. Потому что вызывающий код может хотеть а) использовать свой аллокатор памяти, б) не использовать кучу вообще. А ты ему не даешь выбора. Тебя с такими интерфейсами к написанию библиотек за километр подпускать нельзя.

З.Ы. Юзают одни идиоты на каждый чих new, а потом у них даже плюсы тормозят.

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

Судя по вашим постам, эту фразу вам говорят каждый раз, когда вы открываете свой грязный ротик.

4.2

чисто вымытый.

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

Юзай одно из

 void getVec5(std::vector<int> &vec);
    void getVec6(std::vector<int> *vec);

на выбор. Конкретный вариант является объектом срача.

Всегда предпочитаю вовзращать явно:

std::vector<int> getVec();

Преимущества:

  • читается легче (сразу видно, что возвращаешь)
  • можно результат одной функции передать в качестве аргумента другой.
  • компактнее сгенерированный код

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

redbaron ★★
()
Последнее исправление: redbaron (всего исправлений: 1)
Ответ на: комментарий от E

любой современный компилятор использут copy elission при возможности, так что просто возвращая что-либо никакого копирования не будет (если писать код возвращающей функции с умом).

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

в силу того, что таких функций 95%, то это НАМНОГО ускорит линковку.

-fvisibility=hidden

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

Открой для себя ctags наконец.

Спасибо, я его 6 лет как для себя закрыл в пользу более удобных вещей. Но при простом скролле по коду static все еще заруливает в наглядности.

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

возвращение по значению очень часто будет без копирования.

Правильно. Но речь идёт не о копировании при возврате из ф-ии, а о копировании члена класса.

class A
{
 vector <int> v;
 public:
  vector <int> get_vector() {return v;}
};
В этом случае всегда будет копирование.

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

Ок, без проблем. Тогда это субъективно, потому-что мне static как-то не сильно.

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

Радует, когда идиота видно сразу с первых фраз.

Радует, когда бомж обосрался, но пытается съехать на хаха.

1. Сраный геттер, как я уже сказал, это единственный случай, когда имеет смысл возвращать ссылку.

Где ты это сказал? Нукапруфчик. Тыж кукарекал на гетер, а вдруг уже я прав - окак. Тыж сам, питух, сказал, что «за гетер, который возвращает ссылку - надо убивать, типа там „некопия-ко-ко-ко“»? Потом показал как надо, а теперь уже так не надо.

2. Ты не думал, что тебе стоит писать код в более читабельной манере?

Читабельно для кого? Для тебя, зелёный нуль? Для пацана который нормально осилил ЯП и матчасть - мой код крайне понятен и крайне читабелен. Пацан парсит любые конструкции - ему не нужно упрощение, у него наоборот бомбит от избыточности. Читабельность для пацана - это логичность и компактность кода. Ты ещё не дорос до этого.

И да, конкретно - что там не «очень» читабельно?

Тебе кто-то говорил, что я хочу делать дубликат в куче?

Наверное из-за особенностей стека, блока и ваших классов?

Да так делают только идиоты.

Так как ты делают идиоты анскильные.

Потому что вызывающий код может хотеть а) использовать свой аллокатор памяти

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

б) не использовать кучу вообще.

Пусть не использует, кто ему не даёт? Ты пытаешься свой пробитый кукан как-то оправдать, но не дано.

А ты ему не даешь выбора.

Ты почитай - у меня там get_vec и get_dupvec() - т.е. у меня есть выбор, а ты обосрался ещё раз.

Тебя с такими интерфейсами к написанию библиотек за километр подпускать нельзя.

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

З.Ы. Юзают одни идиоты на каждый чих new, а потом у них даже плюсы тормозят.

Только я вот не юзаю плюсы и у меня ничего не тормазит. Для справки твой вектор итак юзает new и memcpy(). Ты реально веришь в то, что тормазит твой new?

Тыж сам кукарекал, что надо «выдавать копию», а копия вектора - это не его класс-обёртка, а data. Она копируется и юзает твой new. Ибо типа «а вдруг классумрёт», хотя когда класс умрёт - умрёт и твоя копия на стеке.

Ты хочешь со мной посоревноваться и поговорить про «тормазит»? Яж тебя обоссу и занулю, тыб так не шутил.

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

Ахаха, ты обосрался, слился, занулился и теперь пошел стучать: Ссылки на некорректные сообщения (25) (комментарий).

Я просто не могу, ну как такой ущербаной можно быть. Самое смешное, что питух меня назвал идиотом и кукарекает о том, что видители я его обижаю.

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

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

В этом случае всегда будет копирование.

потому-что ты возвращаешь неконстантную копию, которую можно менять. Если ты действительно её меняешь, то компилятору ничего другого не остаётся.

class I
{
  int i;
public:
  int get_int()
  {
    return i;
  }
};

I j;
int k = j.get_int();
k++;// ту ессно копия меняется.

но если ты ничего не меняешь, а просто пишешь скажем f(j.get_int()), то копирование может быть всего одно (точнее вызов конструктора копий в функции), а второго лишнего копирования не будет. Что-бы так было всегда, можно возвращать константную ссылку.

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

Судя по вашим постам, эту фразу вам говорят каждый раз, когда вы открываете свой грязный ротик.

4.2
чисто вымытый.

Вы за анонимуса отвечаете?

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

Ты читать умеешь, да?

http://www.linux.org.ru/forum/development/10148344?cid=10151440

Правильно. Но речь идёт не о копировании при возврате из ф-ии, а о копировании члена класса.

то копирование может быть всего одно

Оно и так будет одно. man RVO.

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

Оно и так будет одно. man RVO.

man NRVO, таки второе копирование может будет, а может и не будет.

а о копировании члена класса.

ты уж определись, RVO или не RVO у тебя?

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

Сколько тебе лет? Ты как маленький совсем. Там вектор потому что изначально речь шла о векторах. Мной же имелось ввиду копирования членов класса вообще. Ты же сам в своих примерах перешёл на int и что-то там лепетал? Давай пойдёшь дальше и заменим вектор неким классом Ї.

class Ї {};

class X {
  Ї ї_;
  public :
     Ї get() {return Ї(ї_);}
};
Ну а так понятней? Или совсем туго?

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

Но он же живой? Значит ротик моет.

Из этого не следует, что он ротик моет.

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