yigal_s: (Default)
[personal profile] yigal_s
Есть такие задачи, которые вообще непонятно, зачем нужны.

Вот например, как написать в С++ класс, который можно инстанциировать, но от которого нельзя наследовать? (Я, кстати, не решил).

Впрочем, всё зависит от контекста, какой-нибудь автор библиотеки вроде boost вполне может такие трюки не только знать, но и использовать.

Главное, не считать, что в них есть какое-то "знание". Это не знание, это всего лишь мастерство использования кривого инструмента. Если такие проблемы вообще нужно решать, их надо решать на уровне самого языка, а не на уровне использования хитрых трюков, связанных с фичами языка.

Конечно, умение такие задачи решать косвенно свидетельствует о квалификации и об интеллекте. Это да. Но увлекаться этим, пожалуй, не следует. Конечно, если вы не планируете стать автором еще одной библиотеки в boost ;-)

Date: 2012-03-28 04:09 pm (UTC)
From: [identity profile] arusinov.livejournal.com
Sealed - это в C#
В 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() {}
};
Edited Date: 2012-03-28 04:32 pm (UTC)

Date: 2012-03-28 04:33 pm (UTC)
From: [identity profile] solomon2.livejournal.com
В C++/CLI есть sealed, но вообще-то, вот за такие штуки C++ и не любят :) Язык должен помогать программисту выражать свои мысли, а не наоборот. В приведенном по ссылке "решении" декларировать "незаконный" класс можно, а инстанциировать нельзя. Это ли не маразм?

Date: 2012-03-28 03:57 pm (UTC)
From: [identity profile] mikkim08.livejournal.com
А если деструктор private сделать ?

(не удержался, хотя уже 10 лет не пишу на С++)

Date: 2012-03-28 04:15 pm (UTC)
From: [identity profile] mikkim08.livejournal.com
Ааа. Если не на heap'е, тогда не знаю, конечно.
И, видимо, уже не узнаю. Хотя, если жизнь заставит ... но уж очень не хочется снова на C++ писать :)