C ++ шаблон проектирования - PullRequest
0 голосов
/ 04 октября 2010

Я хочу сделать следующее, я пишу библиотеку графов.Я хочу, чтобы мой класс был шаблоном.

template < typename T>
class Graph
{
}

Этот класс Graph работает с другим class Vertex

Как мне создать этот класс Vertex, чтобы любой из членов моей команды мог использоватьи мне не нужно менять мою реализацию в class Graph

В основном я хочу, чтобы этот класс Vertex предоставлял пару функций-членов, таких как getWeight, getvisited, setvisited

Таким образом, до тех пор, пока у клиента есть эти функции, класс Graph может использовать класс как есть

Ответы [ 2 ]

1 голос
/ 04 октября 2010

Как правило, класс графа мало что делает, потому что все данные находятся в вершинах или ребрах (в зависимости от того, что представлено объектами - звучит так, будто вы хотите объекты вершин).

Итак, вы можете иметь

template< typename T >
struct Vertex {
    bool visited;
    T data;

    vector< Vertex * > edges;

    size_t getWeight() const { return edges.size(); }

    bool getvisited() const { return visited; }
    void setvisited( bool v ) { visited = v; }
};

Возможно, вы захотите, чтобы графическое стекло владело всеми вершинами и предотвращало проблемы с отключением или циклами при попытке его уничтожить.

template< typename T >
struct Graph {
    typedef Vertex< T > vertex_t;
    deque< vertex_t > vertices;

    vertex_t &get_vertex() {
        return * vertices.insert( vertices.end(), vertex_t() );
    }
};

… и сделайте конструкторы Vertex закрытыми, а Graph его friend, чтобы сделать Graph единственным способом получения вершин.

0 голосов
/ 05 октября 2010

Следующие нижеприведенные сценарии могут помочь при определении интерфейса Vertex. Это даст вам возможность определять сигнатуры заранее, чтобы Graph мог компилировать, а также позволял пользователям расширять Vertex для своих нужд посредством наследования (если это одна из ваших целей).

// Interface only (i.e. pure virtual). The user must implement this method   
// but the signature is defined up front so Graph able to call it.  
class Vertex {
  public:
  virtual int getWeight() = 0;   
};

// Interface with a default implementation (i.e. virtual).  The default 
// implementation is provided by you but the user can override the 
// implementation if needed.
class Vertex {
  public:
  virtual int getWeight();
};

// Interface has a required implementation (i.e. non-virtual).  The user 
// should not override your implementation.
class Vertex {
  public:
  int getWeight();
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...