URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4707
[ Назад ]

Исходное сообщение
"Sealed C++ class."

Отправлено Привет , 30-Сен-05 16:09 
Кто поможет решить задачу?

http://dnevnik.bigmir.net/comments.php?id=446165&cid=118469


Содержание

Сообщения в этом обсуждении
"Sealed C++ class."
Отправлено DeadMustdie , 30-Сен-05 16:29 
>Кто поможет решить задачу?
>
>http://dnevnik.bigmir.net/comments.php?id=446165&cid=118469

Дурацкое дело не хитрое. Задачка для лохов.

class Class
{
private:
  Class() {}

public:
  static Class* newInstance()
  {
    return new Class();
  }
};


"Sealed C++ class."
Отправлено Привет , 01-Окт-05 14:29 
>>Кто поможет решить задачу?
>>
>>http://dnevnik.bigmir.net/comments.php?id=446165&cid=118469
>
>Дурацкое дело не хитрое. Задачка для лохов.
>
>class Class
>{
>private:
>  Class() {}
>
>public:
>  static Class* newInstance()
>  {
>    return new Class();
>  }
>};
Простите, но, используя ваш код, я не могу написать:

int main()
{
  Class c;
  return 0;
}

А это одно из требований.


"Sealed C++ class."
Отправлено DeadMustdie , 01-Окт-05 21:02 
>А это одно из требований.

Дословно требования задачи:

Нужно создать такой тип Sealed, чтобы:
1. У него были public методы
2. Его экземпляр можно было создать
3. У его экземпляра можно было вызывать public методы
4. При попытке наследования (Derived) нельзя было создать экземпляр Derived

Здесь не указано, каким образом должен создаваться экземпляр.


"Sealed C++ class."
Отправлено Lazarenko , 02-Окт-05 01:02 
>>А это одно из требований.
>
>Дословно требования задачи:
>
>Нужно создать такой тип Sealed, чтобы:
>1. У него были public методы
>2. Его экземпляр можно было создать
>3. У его экземпляра можно было вызывать public методы
>4. При попытке наследования (Derived) нельзя было создать экземпляр Derived
>
>Здесь не указано, каким образом должен создаваться экземпляр.

Ну хорошо, скажем так, вместо 2 пункта - его конструктор и деструктор был public.


"Sealed C++ class."
Отправлено Lazarenko , 02-Окт-05 15:17 
Ну что, задача для лохов, простите, как вы выражаетесь, а никто решить не может?

"Sealed C++ class."
Отправлено DeadMustdie , 02-Окт-05 21:37 
>Ну что, задача для лохов, простите, как вы выражаетесь,
>а никто решить не может?

Решение, точно соответствующее букве формулировки задачи, я Вам привёл.
Вариант с protected => private наследованием изящнее, но это лишь
означает, что решение не единственно.

Собственно, практическая полезность конструкции sealed-класса сомнительна,
а потому и синтаксическое изящество - малополезно.


"Sealed C++ class."
Отправлено Lazarenko , 02-Окт-05 15:22 
Кстати, я явно сказал, что нужен аналог C# sealed class. Если вы хоть немного знакомы с C#, то должны знать, что это обычный класс, от которого нельзя наследоваться, а не класс, создаваемый через фабрику.

"Sealed C++ class."
Отправлено DeadMustdie , 02-Окт-05 21:34 
>Если вы хоть немного знакомы с C#

Чур меня, чур! Изыди, нечистое творение Билла!


"Sealed C++ class."
Отправлено Lazarenko , 02-Окт-05 15:20 
Собеседование никто не прошел :-) А решение вот такое:

class SealedBase
{
protected:
  SealedBase() { }
  virtual ~SealedBase() { }
};

class Sealed : virtual private SealedBase
{
public:
  Sealed() { }
  virtual ~Sealed() { }
};

Не решаемая задача - унаследоваться от класса Sealed, это, по сути, аналог C# sealed class.


"Sealed C++ class."
Отправлено DeadMustdie , 02-Окт-05 21:43 
Голь на выдумки хитра. Во всех смыслах:

class SealedBase
{
protected:
  SealedBase() { }
  virtual ~SealedBase() { }
};

class Sealed : virtual private SealedBase
{
public:
  Sealed() { }
  virtual ~Sealed() { }
};

class Bastard : public Sealed, virtual public SealedBase
{
public:
  Bastard()
    : Sealed()
  {}
};


int main()
{
  Bastard bastard;
  return 0;
}


"Sealed C++ class."
Отправлено Lazarenko , 02-Окт-05 23:09 
>Голь на выдумки хитра. Во всех смыслах:
>
>class SealedBase
>{
>protected:
>  SealedBase() { }
>  virtual ~SealedBase() { }
>};
>
>class Sealed : virtual private SealedBase
>{
>public:
>  Sealed() { }
>  virtual ~Sealed() { }
>};
>
>class Bastard : public Sealed, virtual public SealedBase
>{
>public:
>  Bastard()
>    : Sealed()
>  {}
>};
>
>
>int main()
>{
>  Bastard bastard;
>  return 0;
>}

Сдесь у тебя получилось, а вот так, слабо? -

class SealedBase
{
  friend class Sealed;

private:
  SealedBase() { }
  virtual ~SealedBase() { }
};

class Sealed : virtual private SealedBase
{
public:
  Sealed() { }
  virtual ~Sealed() { }
};

Тут уж как бы ты на выдумки не был .... а ничего не выйдет :-)


"Sealed C++ class."
Отправлено jd , 03-Окт-05 09:22 
Это ж надо так изголяться, чтобы из C++ сделать C#... :)

Насчёт "а ничего не выйдет" - средствами языка может и не выйдет, но если очень захочется, то всё прекрасно получится...
Вопрос, зачем вообще это нужно?


"Sealed C++ class."
Отправлено DeadMustdie , 03-Окт-05 18:48 
>Сдесь у тебя получилось, а вот так, слабо? -

Ура! Новый образец академического программирования!
Осталось только приложить формальное доказательство невозможности
наследования от Sealed, основанное на разложении контекстно-свободной
грамматики в нормальную форму Грейбах. :-)

>Тут уж как бы ты на выдумки не был .... а ничего не выйдет :-)

А вот свиней мы с Вами на брудершафт не пасли. ;\


"Sealed C++ class."
Отправлено chip , 03-Окт-05 09:40 
>Собеседование никто не прошел :-) А решение вот такое:

Коту заняться не чем, так он ... ?!

ps: смысл этой игры с никами ?


"Sealed C++ class."
Отправлено DeadMustdie , 03-Окт-05 18:41 
>Коту заняться не чем, так он ... ?!
>
>ps: смысл этой игры с никами ?

Старый Дедушка Маздай никакими другими никами на этом форуме не пользуется.
А то ведь и тараканов в голове нажить можно. ;)


"Sealed C++ class."
Отправлено chip , 04-Окт-05 09:54 
>>Коту заняться не чем, так он ... ?!
>>
>>ps: смысл этой игры с никами ?
>
>Старый Дедушка Маздай никакими другими никами на этом форуме не пользуется.
>А то ведь и тараканов в голове нажить можно. ;)

DeadMustdie ответ-то вопрошавшему. Ты к делу отношения, извени, не имеешь ;)