C ++ вложенный класс, который наследуется от внешнего класса; Неполный тип не допускается - PullRequest
3 голосов
/ 27 января 2020

В kotlin существует шаблон проектирования, в котором вы можете имитировать c быстрое перечисление со связанными значениями с использованием закрытого класса и наследование от него с помощью вложенного класса

https://medium.com/@da_pacheco / using-kotlins-sealed-class-to-приближенный-swift-s-enum-with-data-7e0abac88bbf

Например; Swift имеет:

enum Barcode {
  case UPCA(Int, Int, Int, Int)
  case QRCode(String)
}

Kotlin mimics:

sealed class Barcode {
  class UPCA(val system: Int, val manufacturer: Int, val product: Int, val check: Int) : Barcode()
  class QRCode(val productCode: String) : Barcode()
}

И затем вы можете сделать что-то вроде списка Barcode и перебрать их все.

Вы также можете использовать этот шаблон в Java и C# ... нет «запечатанных классов», поэтому вы не сможете остановить будущих людей, расширяющих список, но он достаточно близок и довольно удобен.

Так что теперь я пытаюсь сделать это в C ++, и я получаю сообщение об ошибке «Неполный тип не разрешен»

class ActionToPerform
{
public:
  class ClearItems: public ActionToPerform
  { };
};

Это имеет некоторый смысл в том, что тип ActionToPerform isn не полностью объявлен в момент, когда компилятор принимает ClearItems, однако это также глупо и раздражает. Я могу переместить класс ClearItems из ActionToPerform, но тогда я потеряю преимущество в области определения объема / пространства имен.

Есть ли способ обойти это? или это просто присущий C ++ предел?

1 Ответ

4 голосов
/ 27 января 2020

Просто объявите ваш производный класс:

class ActionToPerform
{
public:
  class ClearItems;
};

class ActionToPerform::ClearItems: public ActionToPerform
{ };
...