psilogic: (Default)
psilogic ([personal profile] psilogic) wrote2009-07-19 06:21 pm

Зодачка

Специально для любителей шОблоноф и прочих C++ наворотов. :) Сразу пердупердяю: задачка с подвохом.

Дано.

В программе есть некоторое количество классов, которые являются элементами односвязных списков с internal storage (проще говоря, это когда указатель на следующий элемент является членом класса).

Классы имеют вид:
class MyClass...
{
   MyClass *nextListItem;


Причем, варьируется не только название класса, но и название поля "nextListItem".

Задача.

Написать универсальную функцию вставки в начало списка с применением template, inline и pointer-to-member операторов. На входе должны быть: вставляемый элемент; указатель на первый элемент; название поля, указывающего на следующий элемент и тип класса. Функция может быть глобальной или членом namespace или функцией какого-либо нового класса - важно, чтобы она была одна, но работала для всех тех классов. Функция должна работать примерно так же, как ниже представленный #define:

#define INSERT_TO_LIST(firstItemPtr, item, nextItemName) \
(item)->nextItemName= (firstItemPtr), (firstItemPtr)= (item)


Посчитать количество строк в полученной функции. Факультативно: перечислить и обосновать преимущества перед приведенным #define.

Re: мм?

[identity profile] snusmumrikkk.livejournal.com 2009-07-20 07:24 am (UTC)(link)
#include <iostream>

template <class T>
inline T* unshift(T* &list, T* item, T* T::*member)
{ item->*member = list; return list = item; }

template <class T>
struct helper {
    static inline void insert(T *val, T *&first, T *T::*next) 
    { val->*next = first; first = val; }
};

class item {
	item* next;
	friend class helper<item>;
public:
	item(): next(0) {}
	item* getNext() { return next; }
	void prependList(item* &list) { unshift(list, this, &item::next); }
};

int main()
{
	item *a = new item();
	item *b = new item();
	b->prependList(a); // OK

	a = new item();
	b = new item();
	helper<item>::insert(a, b, &item::next);
        // G++ 3.4.5. error: `item*item::next' is private
        // MSVC 9. error C2248: 'item::next' : cannot access private member declared in class 'item'
}

Что-то не то.

> А если оставишь ее внешней, то получится, что ты обращаешься из функции класса к внешней функции unshift которая уже в свою очередь пытается обратиться к приватному полю member класса.
Внешняя функция unshift пытается обратиться не к приватному полю, а к некому (по указателю). Права на доступ к полю, чтоб создать указатель на него, нужны только создателю указателя (в данном случае пользователю unshift, item::prependList()).

По этой же причине твой код не работает: для вызывающего кода такого понятия, как MyClass::nextItem, не существует. Контроль доступа ведь производится на уровне имен (это не Ява какая-нибудь).

Так что я не могу придумать решения, требующее только подружить класс item с кем-нибудь. Указатель на next по-любому приходится создавать внутри item.

[identity profile] psilogic.livejournal.com 2009-07-20 07:25 am (UTC)(link)
Пролох и турбо про лох!

[identity profile] http://technorati.com/people/technorati/ketmar (from livejournal.com) 2009-07-20 07:26 am (UTC)(link)
это всё от безблагодатности. патамуша цпп — не иснтрумент для нормального программирования, увы.

[identity profile] http://technorati.com/people/technorati/ketmar (from livejournal.com) 2009-07-20 07:27 am (UTC)(link)
тогда начнё издалека. ты в курсе, что такое «объектно-ориентированное программирование», и почему в цпп его нет? а также почему делать оное без нормального GC — атомный идиотизм?

[identity profile] psilogic.livejournal.com 2009-07-20 07:28 am (UTC)(link)
Ну каг же, зато они оба - контейнеры. Надо было создать класс std::container с виртуальной фабрикой, мля, а не совать повсюду левые "allocator"-ы.

Если чо - это я так... в порядке стеба... на самом деле мне похуй на STL.

[identity profile] http://technorati.com/people/technorati/ketmar (from livejournal.com) 2009-07-20 07:29 am (UTC)(link)
кстати, это возможно, но нахер не надо. архитектора бить молотком по гойлове, пока не поумнеет. или пока не выучит хотя бы слово «контейнер».

[identity profile] psilogic.livejournal.com 2009-07-20 07:30 am (UTC)(link)
Ну... ничего лучше (по совоПуКности факторов) пока не придумали...

[identity profile] http://technorati.com/people/technorati/ketmar (from livejournal.com) 2009-07-20 07:30 am (UTC)(link)
о! таки да же! таки сделать один контейнер, и не ебать моск непонятно чем!

[identity profile] afa-at-work.livejournal.com 2009-07-20 07:31 am (UTC)(link)
пфе, поруччик!
лисп и только лисп!
и пусть никто не уйдет...

[identity profile] psilogic.livejournal.com 2009-07-20 07:32 am (UTC)(link)
Что-то у тебя молоток зудит... чуть выше ты предлагал бить по голове уже создателя тру-контейнеров...

[identity profile] http://technorati.com/people/technorati/ketmar (from livejournal.com) 2009-07-20 07:34 am (UTC)(link)
да? O_O
Component Pascal, например. Smalltalk. Objective C, кстати сказать, очень достойная вещь.

[identity profile] http://technorati.com/people/technorati/ketmar (from livejournal.com) 2009-07-20 07:34 am (UTC)(link)
ну, и LISP, конечно же. %-)

[identity profile] http://technorati.com/people/technorati/ketmar (from livejournal.com) 2009-07-20 07:35 am (UTC)(link)
увы, вот этого языка я так и не асилил.

[identity profile] http://technorati.com/people/technorati/ketmar (from livejournal.com) 2009-07-20 07:36 am (UTC)(link)
ыыыыы! я первый, первый про LISP сказал ниже!

[identity profile] http://technorati.com/people/technorati/ketmar (from livejournal.com) 2009-07-20 07:36 am (UTC)(link)
а на LISP'е уже и пролог можно написать, гыгы.

[identity profile] psilogic.livejournal.com 2009-07-20 07:37 am (UTC)(link)
Зачем ты с такой любовью перечисляешь сорта говна? :)

[identity profile] psilogic.livejournal.com 2009-07-20 07:38 am (UTC)(link)
Что такое GC? Горбухи Коллектор?

[identity profile] http://technorati.com/people/technorati/ketmar (from livejournal.com) 2009-07-20 07:40 am (UTC)(link)
а любого «улучшателя» цпп в принципе надо бить молотком.

[identity profile] http://technorati.com/people/technorati/ketmar (from livejournal.com) 2009-07-20 07:40 am (UTC)(link)
фе, поручик! не всё, что коричневое — говно! %-)

[identity profile] http://technorati.com/people/technorati/ketmar (from livejournal.com) 2009-07-20 07:41 am (UTC)(link)
Грёбаный Совок.

(в ужасе мацая подбородок)

[identity profile] afa-at-work.livejournal.com 2009-07-20 07:43 am (UTC)(link)
не, побрицца не забыл, ффу...

[identity profile] afa-at-work.livejournal.com 2009-07-20 07:46 am (UTC)(link)
фигась...
цэпэпэ - инструмент для низкоуровнего програмленья, ага.
да, предупреждая стёб - слово "програмленье" - сложносоставное. от программирование и камланье.

Re: (в ужасе мацая подбородок)

[identity profile] http://technorati.com/people/technorati/ketmar (from livejournal.com) 2009-07-20 07:46 am (UTC)(link)
тогда скажи, где, где же учать программить на смолтолке?! и я все оставшиеся годы буду жалеть, что не родился там. потому что меня учили на васике, и это была первая травма детства.

Re: мм?

[identity profile] psilogic.livejournal.com 2009-07-20 07:47 am (UTC)(link)
извини, работать надо, позже отвечу. у меня оно просто в реальном проекте работает, но сходу не увидел, почему твой пример - не компилится.

[identity profile] psilogic.livejournal.com 2009-07-20 07:48 am (UTC)(link)
[ и пусть никто не уйдет... ]

...без своей скобочки =)

Page 2 of 8