Как создать класс, который может инициализировать типы данных C ++? - PullRequest
3 голосов
/ 27 июля 2011

Название в основном говорит обо всем.В основном я хочу сделать это, чтобы я мог создать объект (скажем, пользовательский строковый объект), который может инициализировать параметры других функций в других API.Вот пример того, как я пытался заставить работать собственный целочисленный класс:

#include <iostream>
using namespace std;

class test
{
public:
    int member;
    test(int i) : member(i) {}

    friend int &operator=(int &i, test t);
};

int &operator=(int &i, test t)
{
   return (i = t.member);
}

int main()
{
    int i;
    test t = 90;

    cout << (i = t);
    return 0;
}

К сожалению, я получаю сообщение об ошибке, в котором говорится, что operator = должен быть функцией-членом.Я понимаю, что цель стандарта C ++ состоит в том, чтобы предотвратить реализацию статических и нечленовых перегрузок для оператора присваивания, но есть ли другой способ сделать это?Спасибо за любую помощь / предложения!

Ответы [ 4 ]

5 голосов
/ 27 июля 2011

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

#include <iostream>
using namespace std;

class test
{
public:
    int member;
    test(int i) : member(i) {}
    operator int() const {return member;}
};

int main()
{
    int i;
    test t = 90;

    cout << (i = t);
    return 0;
}
3 голосов
/ 27 июля 2011

Попробуйте это:

class test
{
public:
    int member;
    test(int i) : member(i) {}

    operator int() {return this->member;}
};

int main(void)
{
    int i;
    test t = 90;

    cout << (i = t);
    return 0;
}
3 голосов
/ 27 июля 2011

Для того, что вы пытаетесь сделать, нужен оператор преобразования

operator int() 
{
    return this->member;
}

Для класса, который вы пытаетесь написать (содержащего только целочисленные члены), вам не нужно перегружать оператор =.

= Оператор - это одна из функций-членов, которая генерируется компилятором по умолчанию для каждого класса. Предостережение заключается в том, что оно выполняет простое побитовое копирование (поверхностное копирование) членов класса, поскольку у вас есть только целые числа, этого должно быть достаточно для вас.

Вам нужно было бы перегрузить оператор =, если бы вы динамически размещали указатели в качестве функций-членов, потому что в этом случае поверхностная копия этих указателей приведет к тому, что все объекты, содержащие указатель на член, будут указывать на одно и то же динамическое расположение в памяти & если один из объектов заканчивает свое время жизни, другие объекты остаются с висящим указателем.
Как и @Tony, удачно указывает в наших комментариях. Мелкая копия обычно плохо, но не всегда . Смотрите его комментарии для сценария.

Если вы вообще хотите перегрузить оператор присваивания, проверьте Копировать и поменять местами , чтобы сделать это правильно.

Вы также должны проверить Правило Трех .

1 голос
/ 27 июля 2011

Оператор присваивания не может быть функцией друга.Оператор присваивания может быть объявлен только как нестатическая функция-член.Это сделано для того, чтобы он получил значение L в качестве первого операнда.То же самое верно для операторов [], () и ->.В вашем случае, поскольку тип int является встроенным, вы не можете использовать функцию-член.Вы можете реализовать оператор int () для приведения вашего пользовательского типа к типу int.

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