2010-10-30 2 views
1

Я не имею в виду переменную в классе, а значение по умолчанию для класса в целом.Как написать переменную пользовательского типа в поток

struct Scalar { 
    unsigned int value; 

    void toThePowerOf(int power); 
    // etc. 
} 

Я хотел бы быть в состоянии сделать что-то вроде

Scaler foo; 
foo.value = 2; 
foo.toThePowerOf(2); 

std::cout << foo << std::endl; // Outputs 4! 

Это возможно в C++?

+1

Вы уже можете это написать. Что мне не хватает? –

+1

Фил, я изменил название вопроса на то, что, на мой взгляд, лучше отражает то, что вы пытаетесь спросить. Не стесняйтесь улучшать свой вопрос, если я неправильно понял, что вы хотели. – sbi

+0

Да нет проблем, я не совсем знал, что спросить. – 2010-10-30 13:15:25

ответ

0

Я имел в виду значение по умолчанию для класса, так что если вы назвали этот объект лишь на его имя foo он вернется foo.value по умолчанию.

Это на самом деле можно определить неявное преобразование из Scalar в int:

struct Scalar 
{ 
    unsigned int value; 

    operator int() const 
    { 
     return value; 
    } 
}; 

int main() 
{ 
    Scalar foo = {2}; 
    std::cout << foo << std::endl; 
} 

Но неявные преобразования, как правило, с неодобрением в C++ сообщество, потому что он может сделать код довольно трудно читать. (Я думаю, именно поэтому никто не упомянул операторов конверсии.)

+0

ooo выглядит интересно, я дам ему выстрел. – 2010-10-31 06:54:34

0

Нет, вы не можете, но вы можете перегрузить оператор < < для вашего класса и ostream, чтобы получить желаемый эффект

std::ostream& operator << (std::ostream& out, const Scaler& foo) 
{ 
    return out << foo.value; 
} 

Ваш код теперь будет работать и производить желания привести

1

Нет, классы сделать не имеют значения так, как вы думаете.

То, что вы, вероятно, означает сделать это перегрузить < < оператора:

ostream& operator<<(ostream& output, const Scalar& val) 
{ 
    output << val.value; 
    return output; 
} 
+0

-1: ваш код приводит к бесконечной рекурсии :) –

+0

Hasty typo; уже исправлено. – Sydius

+0

Убрано нижнее нижнее ноль –

0

Да. возможно. Просто инициализируйте все значения в конструкторе класса. Используйте класс вместо struct.

+2

Использование структуры прекрасно, даже некоторые предпочитают некоторые. – 2010-10-30 12:46:19

0

Используйте значение по умолчанию в ctor. Сделать ctor явным, если вы не хотите неявных преобразований.

struct Scalar { 
    unsigned int value; 

    Scalar(int value=0) : value (value) {} 

    void toThePowerOf(int power) { 
    // naive implementation just for show 
    int new_value = 1; 
    assert(power >= 0); // or other error checking 
    for (; power > 0; --power) { 
     new_value *= value; 
    } 
    value = new_value; 
    } 

    friend std::ostream& operator<<(std::ostream &out, Scalar const &x) { 
    out << x.value; 
    return out; 
    } 
}; 
Смежные вопросы