cpp, почему s.query перезаписывается - PullRequest
0 голосов
/ 08 ноября 2018

Я работаю над классом, который облегчает мне создание операторов SQL. Одна из идей, которую я придумал, состояла в том, чтобы использовать перегрузку операторов, чтобы позволить мне добавлять различные типы значений в мой оператор sql. При этом проблема заключается в том, что по какой-то причине каждый раз, когда я снова вызываю оператора, кажется, что он перезаписывает эффекты предыдущего вызова. Вот мой код:

#include <string>
#include <iostream>
using namespace std;
class sql
{
    string query;

  public:
    sql();
    void add(int i);
    void end();
    void print();
    void add_string(string str);
    sql operator+(const string &str) const;
    sql operator+(const int &i) const;
};

sql::sql()
{
    this->query = "";
}

sql sql::operator+(const int &i) const
{
    sql result;
    result.add(i);
    return result;
}

sql sql::operator+(const string &str) const
{
    sql result;
    result.add_string(str);
    return result;
}

void sql::add_string(string str)
{
    this->query = this->query + "'" + str + "',";
}

void sql::add(int i)
{
    query = query + to_string(i) + ",";
}

void sql::end()
{
    query += ";";
}

void sql::print()
{
    cout << this->query;
}

int main()
{
    sql s;
    string s1("terry");
    int i = 10;
    s = s + s1;
    s.print();
    cout << endl;
    s = s + i;
    s.print();
}

Вывод, который я ожидаю:

'terry',
'terry',10,

Но вместо этого есть:

'terry',
10, 

Почему второе использование оператора + отменяет эффекты первого?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018
sql sql::operator+(const int &i) const
{
    sql result;

создает новый, пустой sql

    result.add(i);

добавляет целое число к пустому sql

    return result;
}

Данный sql, this, не использовался. Вместо этого

sql sql::operator+(const int &i) const
{
    sql result(*this);

Скопировать построить новый sql на основе текущего sql

    result.add(i);

добавить i в sql, который содержит содержимое sql предыдущего.

    return result;
}

Вы захотите сделать то же самое с

sql sql::operator+(const string &str) const
0 голосов
/ 08 ноября 2018

Если вы внимательно посмотрите на реализацию operator +, будет очевидно, что она не использует левый боковой объект.

sql sql::operator+(const string &str) const
{
    sql result;
    result.query = this->query; // concat whatever was stored in the left-side object
    result.add_string(str);
    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...