Обращение к левому объекту в перегрузке

192
26 апреля 2017, 12:36

Недавно начал изучать перегрузку операторов. Пытаюсь перегрузить оператор * как пересечение множеств, но не могу понять как в данном случае обратиться к левому объекту.

template <class T>
class Set
{
public:
T ch;
set <T> cs; //создаем множество
Set()
{
    int n;
    T temp;
    cout << "Количество элементов множества";
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> temp;
        cs.insert(temp);
    }
}
template <class T>void operator * (Set <T> second)
{
    //Как обратиться к first?
    second.Print();
}
void Print()
{
    set <T>::iterator ik;
    for (ik = cs.begin(); ik != cs.end(); ++ik)
        cout << *ik << "  ";
    cout << endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL,"ru");
Set<char>first;
first.Print();
first = first + 'd';
first.Print();
Set<char>second;
second.Print();
first*second;
system("pause");
return 0;
}
Answer 1

Указатель на него - this, ссылка - *this...

Это же просто ваш объект, членом которого является оператор.

И еще - скажите, а где вы намерены хранить результат пересечения множеств? Ваш оператор не возвращает ничего, так что у вас возможна просто запись

Set1 * Set2;

И где будет пересечение - в Set1 или в Set2? Кстати, поскольку у вас оператор получает объект по значению, Set2 просто копируется. Это вам точно надо?

Может, логичнее было бы

Set operator*(const Set& s1, const Set& s2)

Именно так - не член класса, а свободная функция? (шаблонность для краткости я опустил)

Опять же, вы так вольно обошлись с шаблоном внутри шаблона, что не удивлюсь, если вы вскоре будете задавать новые вопросы по поводу вашего кода...

Answer 2

Имеется несколько способов. Во-первых, вы можете вызвать функцию-член класса, используя неквалифицированное имя. Например,

Print();

Во-вторых, вы можете использовать указатель this. Например,

this->Print();

Имейте в виду, что возвращаемый тип оператора * void не имеет смысла. Так как этот оператор вы хотите перегрузить для операции пересечения множеств, то он должен возвращать множество, соответствующее пересечению.

READ ALSO
Как можно распаковать\получить инфу о файлах архива в C++?

Как можно распаковать\получить инфу о файлах архива в C++?

Архивы форматов rar,zip, необходимо: распаковывать архив, получать определенный фаил из архива, получать древо каталогов и список всех файлов...

229
Многопоточность, потоки

Многопоточность, потоки

Я новичок в этой темеХотел попробовать сделать одновременную работу нескольких функций

211
Деструктор производного класса

Деструктор производного класса

Следует ли объявлять деструктор производного класса виртуальным, если в базовом классе он уже помечен таковым? Те

202
операции с числами в разных системах счисления C++ builder [требует правки]

операции с числами в разных системах счисления C++ builder [требует правки]

ЗдравствуйтеНеобходимо написать калькулятор систем счисления с возможностью сложения, вычитания и умножения цифр

284