c ++ перегрузка `-` - PullRequest
       11

c ++ перегрузка `-`

0 голосов
/ 07 мая 2009

Я сделал перегрузку оператора на «-» для моего графа классов. Это использование не полностью интуитивно понятно (плохое кодирование - я знаю), но если я сделаю graph3 = graph2-graph1, то график 3 будет должен принимать только эти вершины в графе 2 и графе 1.

Итак, я написал код, и когда я запускаю отладчик, оператор-функция, похоже, создает новый «граф» для возврата и добавляет соответствующие вершины в новый граф а затем отладчик, похоже, выходит из функции, но никогда не возвращается главный. Как будто он ждет, чтобы я что-то ввел. Сообщения об ошибках не отображаются.

Вот код:

char stringy[100];
//cin>>stringy;
strcpy(stringy,"|12,34,25,2,3,2|(3->2),(2->1),(5->9),(2->1)|");
char* param= new char[sizeof(stringy)];
strcpy(param,stringy);
Graph graph1(param);

 char sstring[20] = "|33,34,11|(2->33)|";
Graph graph2(sstring);
cout<<graph2.outSumm()<<endl;

Graph graph3;
//until here everything works fine
graph3= graph1-graph2; //the debugger does this and then 

cout<<graph3.outSumm()<<endl;

Оператор-функция:

Graph Graph::operator- (const Graph& g2) const
{
Graph created;

//goes through "this" list and if value exists in g2 copies it to created
for(int i=0;i<vertList.getSize();i++)
{
 if (g2.vertList.find(vertList.read(i))!=999)
 created.addVertex(vertList.read(i).getInt());
}

return created;
}

Я использую кодовые блоки.

Конструктор копирования:

Graph(const Graph& g2):      
maxVal(g2.maxVal),vertList(g2.vertList),edgeList(g2.edgeList){} ;

Оператор присваивания:

void Graph::operator= (const Graph& g2)
{
 if (this==&g2)
 {
 cout<<"not the greatest idea"<<endl;
 return;
 }

 vertList.delete_List();
 edgeList.delete_List();
 maxVal=0;

addValues(g2.outSumm());
}

Ответы [ 3 ]

2 голосов
/ 07 мая 2009

Похоже, ваш код находится в бесконечном цикле. Вы пытались взломать отладчик, когда программа останавливается?

У вас есть конструктор копирования, определенный в классе Graph? Это необходимо для успешного возврата значения с использованием локальной переменной created.

2 голосов
/ 07 мая 2009

Не относится конкретно к вашему вопросу (хотя это может быть), почему вы не используете std :: string? И если вы должны использовать массивы символов, почему бы и нет:

char stringy[100] = "|12,34,25,2,3,2|(3->2),(2->1),(5->9),(2->1)|";
Graph graph1( stringy );

или даже:

Graph graph1( "|12,34,25,2,3,2|(3->2),(2->1),(5->9),(2->1)|" );

Или вы храните указатель, переданный в конструктор в вашем классе? Если это так, то это плохая идея, и мой совет использовать std :: strings удваивается.

0 голосов
/ 07 мая 2009

Вместо реализации operator-, вместо operator: =:

Graph& Graph::operator-=(const Graph& rhs)
{
    // remove nodes not in both Graphs

    return *this;
}

Тогда просто реализуйте оператор в терминах этого:

Graph Graph::operator-(const Graph& rhs)
{
    Graph temp(*this);
    temp -= rhs;
    return temp;
}

Посмотрите, работает ли это.

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