2015-03-11 2 views
0

Для части назначения я должен создать оператор присваивания для класса с именем HashGraph, созданного моим профессором.Правильно вызовите функцию во вложенном классе из внешнего класса C++

Это то, что прототип функции выглядит следующим образом:

HashGraph<T>& operator = (const HashGraph<T>& rhs); 

В этом HashGraph<T> классе, у меня есть вложенный частный класс под названием LocalInfo, который хранит четыре набора (определяются моим профессор) и ссылка на HashGraph. Вот вложенный частный класс:

private: 
    //All methods and operators relating to LocalInfo are defined below, followed by 
    // friend functions for insertion onto output streams of HashGrah and LocalInfo 
    class LocalInfo { 
     public: 
     LocalInfo()    : from_graph(nullptr), out_nodes(hash_str), in_nodes(hash_str), out_edges(hash_pair_str), in_edges(hash_pair_str) {} 
     LocalInfo(HashGraph<T>* g) : from_graph(g),  out_nodes(hash_str), in_nodes(hash_str), out_edges(hash_pair_str), in_edges(hash_pair_str) {} 
     void connect(HashGraph<T>* g) {from_graph = g;} 

     bool operator == (const LocalInfo& rhs) const { 
      return this->in_nodes == rhs.in_nodes && this->out_nodes == rhs.out_nodes && 
       this->in_edges == rhs.in_edges && this->out_edges == rhs.out_edges; 
     } 
     bool operator != (const LocalInfo& rhs) const { 
      return !(*this == rhs); 
     } 

     //from_graph should point to the HashGraph LocalInfo is in, so LocalInfo 
     // methods (see <<) 
     HashGraph<T>* from_graph; 
     ics::HashSet<std::string>      out_nodes; 
     ics::HashSet<std::string>      in_nodes; 
     ics::HashSet<ics::pair<std::string,std::string>> out_edges; 
     ics::HashSet<ics::pair<std::string,std::string>> in_edges; 
    };//LocalInfo 

В моем операторе присваивания, я должен скопировать rhs граф в this и вернуть вновь скопированный график. Мой профессор говорит, что я должен использовать connect, который находится в классе LocalInfo, так что каждый скопированный объект LocalInfo сбрасывает from_graph на новый график (this).

Вот что моя функция выглядит как прямо сейчас:

template<class T> 
HashGraph<T>& HashGraph<T>::operator = (const HashGraph<T>& rhs){ 
    this->clear(); 
    for(auto i : rhs.node_values) { 
     HashGraph<T>::LocalInfo temp; 
     temp.connect(rhs); 
     node_values[i.first] = temp; 
    } 
    edge_values = rhs.edge_values; 
    return *this; 
} 

Это, однако, не компилируется из-за линии temp.connect(rhs), где он говорит, что есть no matching function call to HashGraph<int>::LocalInfo::connect(const HashGraph<int>&).

Способ, которым мой профессор настроен, заключается в том, что this->clear() действительно пуст this HashGraph. Чтобы скопировать карту node_values, я использую его итератор для прохождения по карте rhs.node_values.

В ноте, он это настроить так, что вызов node_values[i.first] = temp будет на самом деле создать ключ в node_values, которая является ключом с правой стороны, а затем присвоить значение temp (который является LocalInfo объект) в том, что ключ.

Но, как я уже сказал, это не компилируется. Итак, как я могу правильно использовать connect()?

ответ

1

Вы уверены, что вы хотите подключиться к rhs и не this? rhs - const HashGraph<int> &, из-за чего у вас нет доступа к изменению структуры.

+0

Я уверен, что мне нужно иметь rhs внутри соединения.Затем сохраните это в lhs. Поскольку граф, переданный в connect (g), присваивается 'from_graph', который применяется к' this' – Alex

2

Функция хочет указатель, а не объект или ссылку.

temp.connect(&rhs); 
+0

Это дает мне эту ошибку: 'ошибку: недопустимое преобразование из 'константного мика :: HashGraph *' до 'мика :: HashGraph * [-fpermissive] temp.connect ( ^ ../src /hash_graph.hpp:71:14: ошибка: инициализация аргумента 1 из 'void ics :: HashGraph :: LocalInfo :: connect (ics :: HashGraph *) [с T = int]' [-fpermissive] void connect (HashGraph * g) {from_graph = g;} ' – Alex

+0

@Alex: О, да, я не заметил, что это аргумент функции' const'. Вы должны сделать это не 'const', если вам что-то нужно сохраните указатель на него, не являющийся 'const', или, возможно, вы хотите подключить 'this' not' * rhs'. Трудно догадаться, что w что код должен делать. –

+0

Ах .. да, temp.connect (это), 'работал. Я понятия не имею, почему быть честным, так как я думал, что должен был подключить правую сторону к левой стороне. – Alex

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