2013-12-04 3 views
0

давний lurker, впервые обжалующий. Я делаю проект на TSP (проблема коммивояжера) в C++, и у меня есть небольшой вопрос. Мне нужно взять два узла (называемые NodeID в этом сценарии, они являются беззнаковыми ints) и добавить границу между ними в методе addEdge. Подпись вместе с некоторыми примечаниями от моего учителя (я заполню предпосылки позже):C++: доступ к закрытым переменным в абстрактном базовом классе

/* 
* Add a weighted, undirected edge between nodes u and v. 
* 
* Preconditions: 
*  u and v are legal labels (i.e. 0 <= u < G.size(), 0 <= v < G.size()) 
*  u != v 
*  There is no edge between u and v. 
*  weight > 0 
*/ 
void ListGraph::addEdge(NodeID u, NodeID v, EdgeWeight weight) { 

    /* Code here */ 

} 

Теперь, как я вижу себя кодированием это ссылки на список ребер и узлов в базовом классе. Однако базовый класс является абстрактным, а список является частным. Вот весь этот базовый класс. Примечания: Этот класс должен остаться как IS (это класс учителя и один из немногих в проекте, я должен оставаться верным и использовать, не изменяя его.) Вот оно:

#include <vector> 
#include "Graph.h" 

#pragma once 

typedef std::list<NWPair> EList; 

class ListGraph : public Graph { 
public: 
    ListGraph(int numNodes); 
    ~ListGraph(); 

    // Modifiers 
    virtual void addEdge(NodeID u, NodeID v, EdgeWeight weight); 

    // Inspectors 
    virtual EdgeWeight weight(NodeID u, NodeID v) const; 
    virtual std::list<NWPair> getAdj(NodeID u) const; 
    virtual unsigned degree(NodeID u) const; 
    virtual unsigned size() const; 
    virtual unsigned numEdges() const; 

private: 
    ListGraph() {;} 

    std::vector<EList> edgeList; 
    int num_edges; 
}; 

Единственным способ, которым я может думать добавить вес к краю между узлами, чтобы получить доступ к этому краевому списку и изменить его. Любые предложения были бы весьма полезными.

Здесь все Graph.h если кто нуждается в этом:

#include <utility> 
#include <list> 

#pragma once 

/* 
* Useful typedefs, primarily for the purpose of read-ability. 
*/ 
typedef unsigned NodeID; 
typedef double EdgeWeight; 
typedef std::pair<NodeID, EdgeWeight> NWPair; 


class Graph { 
public: 
    virtual ~Graph() {} 

    /* 
    * Add a weighted, undirected edge between nodes u and v. 
    * 
    * Preconditions: 
    *  u and v are legal labels (i.e. 0 <= u < G.size(), 0 <= v < G.size()) 
    *  u != v 
    *  There is no edge between u and v. 
    *  weight > 0 
    */ 
    virtual void addEdge(NodeID u, NodeID v, EdgeWeight weight) = 0; 


    /* 
    * Get the weight between nodes u and v; return 0 if there is no edge. 
    * 
    * Preconditions: 
    *  u and v are legal labels (i.e. 0 <= u < G.size(), 0 <= v < G.size()) 
    */ 
    virtual EdgeWeight weight(NodeID u, NodeID v) const = 0; 

    /* 
    * Return a list of NodeID/EdgeWeight pairs describing the nodes adjacent to edge w. 
    * 
    * Preconditions: u is a legal label. 
    */ 
    virtual std::list<NWPair> getAdj(NodeID u) const = 0; 

    /* 
    * Return the degree (i.e. the number of neighorbs) of node u. 
    * 
    * Preconditions: u is a legal label; 
    */ 
    virtual unsigned degree(NodeID u) const = 0; 

    /* 
    * Return the number of nodes in the graph. 
    */ 
    virtual unsigned size() const = 0; 

    /* 
    * Return the number of edges in the graph. 
    */ 
    virtual unsigned numEdges() const = 0; 
}; 

Как я уже сказал, что любая помощь будет принята с благодарностью. Благодаря!

Редактирование: попытка ссылки edgeList с «ListGraph :: edgeList» в методе «ListGraph :: addEdge» приводит к ошибке. Когда я держу свой курсор, он говорит следующее: Ошибка: класс «ListGraph» не имеет члена «edgeList»

изменить 2: этот код в трех файлах. Graph.h: неизменный, абстрактный; где все методы: ListGraph.h: неизменяемый, в основном абстрактный; где edgeList и num_edges являются (это частный) ListGraph.cpp: где я положу свой код, и, казалось бы, где я не могу получить доступ к закрытым переменным, такие как edgeList и num_edges

редактировать 3: Я идиотка, я поставил все методы в ListGraph.cpp в классе ListGraph, поэтому программа искала ListGraph.cpp, а не ListGraph.h. Извините, потратил много времени, и продолжайте и удалите это, если хотите, или я скоро. Спасибо, ребята, извините.

+0

Вы могли бы попросить какие-либо проблемы? Я думаю, вы можете получить доступ к 'edgeList' из функции' addEdge' и добавить вес к краю между узлами, не так ли? –

+0

Я попытаюсь упростить свою проблему: Внутри класса .cpp-файла У меня есть метод, в котором я пытаюсь получить доступ к частной переменной из .h-файла с тем же именем. Файл .cpp включает в себя .h-файл, метод имеет имя класса :: methodName, а ссылка имеет ClassName :: varName, где этот var является частной переменной файла .h. – user3064756

ответ

0

В этом случае Graph является базовым классом, не ListGraph, так что я не уверен, что если ваше описание является точным, но, как я понимаю, вы реализуете ListGraph::addEdge() .. так что вы можете получить доступ к ListGraph::edgeList.

1

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

Насколько я понимаю, вы собираетесь поставить код в метод

addEdge() 

в

class ListGraph 

Это дает вам доступ к частной переменной «edgeList».

Абстрактный класс - это класс «График», который наследует «ListGraph». Тем не менее, частные переменные в ListGraph доступны для класса ListGraph.

Ваша логика хорошо, но я думаю, вы поняли «ПРИМЕЧАНИЕ: Этот класс должен ОСТАВАТЬСЯ КАК ЕСТЬ», как ут говорит

/* Code here */ 

в методе addEdge, я уверен, что вы можете редактировать Это! :)

0

Базовый класс Graph на самом деле просто указывает, что вам нужно предоставить, когда вы выходите из него, поэтому его функции являются «чистыми виртуальными». Класс ListGraph - это где данные, и где вы собираетесь определить функцию addEdge. В этой функции вы будете иметь доступ для чтения/записи к edgeList. Попробуй, это сработает.

Смежные вопросы