Примитив пользовательского задания на строительство - PullRequest
1 голос
/ 08 мая 2011

Извините за размытое название, мне кажется, что-то не хватает.

Я не решался опубликовать это, потому что это кажется таким простым, но я не могу заставить его работать. Моя IDE говорит мне, что следующее неверно. У меня есть класс IRatio, который я хочу заменить на long double.

class
IRatio
{
    protected:
        long double 
        mValue;

    public:
        IRatio();

        IRatio(
            const IRatio& ir);

        IRatio(
            const long double& ld);

        IRatio&
        operator=(
            const IRatio& ir);

        IRatio&
        operator=(
            const long double& ld);

        operator long double() const;
};

Теперь я знаю, что работают следующие строки:

IRatio n1(0.01f);
IRatio n2;
n2 = 0.02f;

Однако, к моему удивлению, эта строка не работает:

IRatio n3 = 0.03f;

Как мне заставить это работать? Я предположил, что конструктор копирования был вызван в этом случае? Или даже если это был оператор присваивания, я не против! Я знаю, что std :: string может это сделать.

std::string s = "hello!";

Спасибо

Ответы [ 2 ]

0 голосов
/ 08 мая 2011

Ваш код должен работать как есть.Тем не менее, IRatio не управляет никакими ресурсами самостоятельно, поэтому вам не нужны конструктор копирования и оператор присваивания.Это должно сделать:

struct IRatio {
    IRatio() : d(0L) { }
    IRatio(long double d) : d(d) { }
    operator long double() const { return d; }
private:
    long double d;
};

int main(int argc, char* argv[])
{
    IRatio r = 0.02f;
    return 0;
}
0 голосов
/ 08 мая 2011

Ваш код должен работать.Однако 0.03f имеет тип float.Вы хотите сказать 0.03L, чтобы сказать long double.Но это не обязательно имеет значение, float конвертируется в long double.

Да, конструктор с параметром const long double& будет использоваться для создания временного объекта IRatio, который будет скопирован в n3 (и ваш компилятор должен оптимизировать копию, так что вы, скорее всего, несмотрите вызов конструктора копирования здесь, если вы не сказали, чтобы он не оптимизировался).

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