программизм
Mar. 28th, 2012 11:10 amЕсть такие задачи, которые вообще непонятно, зачем нужны.
Вот например, как написать в С++ класс, который можно инстанциировать, но от которого нельзя наследовать? (Я, кстати, не решил).
Впрочем, всё зависит от контекста, какой-нибудь автор библиотеки вроде boost вполне может такие трюки не только знать, но и использовать.
Главное, не считать, что в них есть какое-то "знание". Это не знание, это всего лишь мастерство использования кривого инструмента. Если такие проблемы вообще нужно решать, их надо решать на уровне самого языка, а не на уровне использования хитрых трюков, связанных с фичами языка.
Конечно, умение такие задачи решать косвенно свидетельствует о квалификации и об интеллекте. Это да. Но увлекаться этим, пожалуй, не следует. Конечно, если вы не планируете стать автором еще одной библиотеки в boost ;-)
Вот например, как написать в С++ класс, который можно инстанциировать, но от которого нельзя наследовать? (Я, кстати, не решил).
Впрочем, всё зависит от контекста, какой-нибудь автор библиотеки вроде boost вполне может такие трюки не только знать, но и использовать.
Главное, не считать, что в них есть какое-то "знание". Это не знание, это всего лишь мастерство использования кривого инструмента. Если такие проблемы вообще нужно решать, их надо решать на уровне самого языка, а не на уровне использования хитрых трюков, связанных с фичами языка.
Конечно, умение такие задачи решать косвенно свидетельствует о квалификации и об интеллекте. Это да. Но увлекаться этим, пожалуй, не следует. Конечно, если вы не планируете стать автором еще одной библиотеки в boost ;-)
no subject
Date: 2012-03-28 03:11 pm (UTC)no subject
Date: 2012-03-28 04:09 pm (UTC)В C++ до последнего времени не было такого понятия (сейчас посмотрел, что в C++11, оказывается, есть - называется final) - нужного эффекта добивались хитрым определением класса с "приватным" констрактором, который получает класс, от которого запрещено наследовать, в качестве темплейт-параметра.
Вот тут приведёно возможное решение:
template <<>class T<>>
class Generic_lock
{
friend T;
Generic_lock() {} //private
Generic_lock(const Generic_lock&) {} //private
};
class Usable : public virtual Generic_lock
{
public:
Usable() {}
};
no subject
Date: 2012-03-28 04:33 pm (UTC)no subject
Date: 2012-03-28 04:46 pm (UTC)no subject
Date: 2012-03-28 03:57 pm (UTC)(не удержался, хотя уже 10 лет не пишу на С++)
no subject
Date: 2012-03-28 04:02 pm (UTC)no subject
Date: 2012-03-28 04:15 pm (UTC)И, видимо, уже не узнаю. Хотя, если жизнь заставит ... но уж очень не хочется снова на C++ писать :)