Может ли класс содержать собственный список? - PullRequest
1 голос
/ 22 ноября 2011

Хорошо, поэтому я пишу простой интерпретатор схем (ala Bootstrap Scheme ), но в C ++ 11 (однако этот вопрос не является специфичным для C ++ 11). Я пытаюсь придумать разумную форму для моего класса «Объект». В настоящее время мой макет выглядит примерно так:

typedef union {
  int i;
  double d;
  char c;
} value;

class Object {
public:
  //Constructors and stuffs...

private:
  obj_type type;
  value val;
  list<Object> l;
};

Я попытался поместить список в объединение (которое было в классе), но компилятор пожаловался. Мой вопрос таков: возможно ли поместить список класса в сам класс? Я думаю, что я должен быть в состоянии, так как по умолчанию в списке не будет объектов (так что нет бесконечного роста).

Во-вторых, если это невозможно, есть ли другие предложения о том, как это реализовать? Я знаю, что могу реализовать список в стиле C (с указателями), но списки STL значительно упрощают процесс.

ОБНОВЛЕНИЕ: Хорошо, так что указатели кажутся хорошим решением. Я не хочу использовать Boost, потому что эту библиотеку я еще не использовал широко, и я делаю это частично как упражнение, чтобы получить большее мастерство над STL.

ОБНОВЛЕНИЕ 2: Новый код выглядит следующим образом:

class Object {
//...
private:
  obj_type type;
  int i;
  double d;
  char c;
  deque<Object*> l;
};

Но я все еще получаю ошибку компилятора: ‘deque’ does not name a type.

Ответы [ 6 ]

2 голосов
/ 22 ноября 2011

избавиться от ошибки "deque" не называет тип "по:

включает заголовок

#include <deque>

с использованием пространства имен std

using namespace std;

или просто сделайте это (вместо использования пространства имен)

std::deque<Object*> l;
2 голосов
/ 22 ноября 2011

Еще один вариант ...

Начиная с Boost 1.48 есть библиотека Container , которая предоставляет контейнеры неполных типов . Позволяя именно то, что вы пытаетесь достичь.

1 голос
/ 22 ноября 2011

Что касается вашего вопроса, да, не должно быть никаких проблем.Теперь вы обязательно хотите?Зависит.Список указателей или интеллектуальных указателей может быть лучше, если, например, вы хотите поделиться или передать право собственности на объекты в списке или если вы хотите полиморфное поведение объектов.

Это отдельная проблема, но яне будет использовать союз.Они обычно не одобряются в C ++.Как предлагается ниже, наследование является «правильным» ОО способом.

В качестве еще одной незначительной проблемы рассмотрите возможность использования vector вместо list, если только вы не делаете лот вставок / удалений в середине списка.(Эффективный STL Майерса защищает это. Но в вашем случае это, вероятно, не имеет никакого значения).

0 голосов
/ 22 ноября 2011

На самом деле существует другое решение вашей проблемы: рассматривали ли вы возможность разделения вашего объекта на две части?

Вы можете иметь структуру ObjectCore, содержащую как enum и union, так и сам класс Object, который будет содержать только один ObjectCore и deque<ObjectCore>.

Если вы хотите, для лучшей изоляции, вы можете определить ObjectCore как внутренний класс самого класса Object, он все равно будет работать.

0 голосов
/ 22 ноября 2011

Я предлагаю использовать наследование (т. Е. Иметь абстрактный Value суперкласс с Integer, Symbol, List и т. Д. ... подклассами). В них вы можете использовать STL контейнеры с указателями (или ссылками), то есть std::list<Value*> или std::vector<Value*> или std::map<Symbol*,Value*> и т. Д.).

Для сбора мусора рассмотрите возможность использования Boehm's GC ; но не забывайте GC; это неотъемлемая часть любой реализации, подобной Lisp, и вам лучше подумать об этом в самом начале разработки. Напомним, что GC имеет дело с глобальным свойством программы (наличие живых данных не является модульным свойством).

См. Также этот вопрос

0 голосов
/ 22 ноября 2011

Список указателей должен компилироваться.

list<Object*> l;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...