создание указателя на вектор в классе - PullRequest
0 голосов
/ 27 октября 2011

Я создаю программное обеспечение САПР, в котором у меня есть класс точка и класс линия .

#include <vector>
using namespace std;
class point
{
private:
    vector<int>* child;
    int id;//this is unique id of a point
    double x;//absolute x, y, z co-ord
    double y;//
    double z;//
};

class line
{
private:
    point *a;
    point *b;
    int id;//this is unique for each line object
}

любой объект строки является потомком 2точечные объекты.поэтому, если я удаляю точку линии, то объект линии также должен быть удален.Для этого я хочу сохранить id всех дочерних элементов (линия, круг, треугольник, ....) точечного объекта в векторе child (переменная экземпляра класса point какпоказано в коде).

мой вопрос - правильный ли мой подход?Я имею в виду, что в исполнении будет около 100 точечных объектов.поскольку каждый вектор выделяет некоторую дополнительную память, будет много выделенной памяти, которая не будет использоваться при выполнении.Кто-нибудь может предложить альтернативный способ хранения неизвестного номера int в виде последовательности в каждом точечном объекте?

Ответы [ 3 ]

2 голосов
/ 27 октября 2011

Вам не нужно использовать указатель на вектор, объект будет делать:

#include <vector>
class point
{
private:
   std::vector<int> child;
   int id;//this is unique id of a point
   double x;//absolute x, y, z co-ord
   double y;//
   double z;//
};

Не забудьте включить <vector> и квалифицировать свое использование с std::vector.

1 голос
/ 27 октября 2011

мой вопрос: как мне создать этот вектор и где (чтобы он не выходил за рамки)?

Вы уже сделали это правильно. Я бы посоветовал вам не использовать указатель на vector, а просто vector:

private:
    vector<int> child;

Это значительно облегчает обработку, и вам не нужно выделять / сдавать ее самостоятельно.


как заставить моего ребенка указывать на созданный вектор без утечки памяти?

Если вам действительно нужен динамически распределенный указатель, вам нужно вызвать new и delete. Для правильного поведения вы должны определить как конструктор, так и деструктор в вашем point классе:

class point
{
private:
    point() : child(new vector<int>) {}
    ~point() { delete child; }

    vector<int>* child;
    int id;//this is unique id of a point
    double x;//absolute x, y, z co-ord
    double y;//
    double z;//
};

Но я все же рекомендую вам не использовать указатель на vector, как я объяснил выше.

0 голосов
/ 27 октября 2011

Я бы решил проблему совершенно по-другому.

Я бы оставил две глобальные хеш-таблицы по идентификатору: одну для точек и одну для линий. Тогда я бы использовал структуру данных двусвязного списка для каждой точки, чтобы вы знали, сколько линий используют данную точку.

Я бы упростил доступ к этой структуре данных с помощью простых операций в глобальном контейнерном классе.

Я постараюсь написать "псевдо" код, чтобы сделать его более понятным (скоро редактирование).

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