давний 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. Извините, потратил много времени, и продолжайте и удалите это, если хотите, или я скоро. Спасибо, ребята, извините.
Вы могли бы попросить какие-либо проблемы? Я думаю, вы можете получить доступ к 'edgeList' из функции' addEdge' и добавить вес к краю между узлами, не так ли? –
Я попытаюсь упростить свою проблему: Внутри класса .cpp-файла У меня есть метод, в котором я пытаюсь получить доступ к частной переменной из .h-файла с тем же именем. Файл .cpp включает в себя .h-файл, метод имеет имя класса :: methodName, а ссылка имеет ClassName :: varName, где этот var является частной переменной файла .h. – user3064756