2015-03-25 3 views
0

Я создаю двоичную программу дерева, и я хотел бы перегрузить несколько операторов. Я попытался перегрузить оператор +, так что, когда я пишу что-то вроде myTree + 5, он добавит 5 в качестве узла на дереве.Ошибка сегментации при перегрузке оператора

Это мой код:

BST myTree; 

void operator+(BST left, int right) { 
    myTree.addLeaf(right); 
} 

int main() {  
    vector<int> treeKeyList; 
    srand((unsigned)time(NULL)); 
    int before = rand() % 20 + 1; 
    for (int i = 0; i < before; i++) { 
     int after = rand() % 20 + 1; 
     treeKeyList.push_back(after); 
     cout << treeKeyList[i] << " "; 
    } 
    cout << endl; 

    for (int i = 0; i < treeKeyList.size(); i++) { 
     myTree + treeKeyList[i]; 
    } 
} 

На данный момент, кажется, прекрасно работать через одну петлю, однако он выходит из строя, когда он пытается добавить второе значение с ошибкой ошибки сегментации. Я думаю, что проблема должна быть в коде, который я показал, так как раньше я добавил, что перегрузка работала нормально. Если бы я сделал это, то:

for (int i = 0; i < treeKeyList.size(); i++) { 
    myTree.addLeaf(treeKeyList[i]); 
} 

Работает абсолютно нормально. Есть идеи?

+2

1) Ваша перегрузка не является интуитивной, потому что оператор «+» обычно не мутирует, это левая сторона. 2) Даже если вы считаете, что он изменяет левую сторону - он фактически копирует его при передаче функции и мутирует копию, поэтому он, вероятно, не действует так, как вы планировали, – Predelnik

+1

[This] (http: // stackoverflow .com/q/4421706/3425536). – emlai

+0

Ваш оператор + принимает свой левый аргумент по значению, мутирует его и затем отбрасывает. Вы намеревались добавить узел во временную копию своего дерева, к которой вы никогда не сможете получить доступ? – Useless

ответ

1

Скорее всего, вам необходимо взять BST в качестве ссылки. Также рассмотрите использование += вместо +.

+0

Это исправило проблему. Благодаря! Впоследствии я понял, что я хотел бы сделать «tree = tree + 5», а не «tree + 5», но, надеюсь, это не будет слишком сложно изменить. – user3746428

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