Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
ComputerMouse
6 / 6 / 3
Регистрация: 06.11.2012
Сообщений: 254
#1

Научить cout и printf работать со своим классом - C++

27.08.2013, 23:31. Просмотров 551. Ответов 3
Метки нет (Все метки)

Решил я написать для некоторых своих задач реализацию под C++ тернарной логики. Написал класс tern со всеми необходимыми функциями, и основная проблема сейчас -- то что ни cout ни printf с моими классами, разумеется, не работают. Я пока просто написал оператор ~ который выдает текстовое значение объекта, но хотелось бы обойтись без него, чтобы можно было написать, скажем, так:
C++
1
2
3
tern a;
a << false;//Так у меня выглядит присваивание, ибо оператор = переопределить не получилось
cout << "Value:" << a << endl;
или
C++
1
printf ("%t", a);
Можно ли реализовать это хотя бы для одного из этих операторов?

Добавлено через 1 минуту
На всякий случай код класса и используемого им enum'a:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
enum ternary {tern_true, tern_false, tern_dontknow};
 
class tern
{
private:
    ternary base;
public:
    tern (ternary t)
    {
        base=t;
    }
    tern ()
    {
        
    }
    void set (ternary t)
    {
        this->base=t;
    }
    void set (bool b)
    {
        if (b) this->base = tern_true;
        else this->base = tern_false;
    }
    const char *toString (void)
    {
        switch (base)
        {
            case tern_true:
                return "true";
                break;
            case tern_false:
                return "false";
                break;
            case tern_dontknow:
                return "dontknow";
                break;
        }
        return "dontknow";
    }
    tern NOT (void)
    {
        ternary temp;
        switch (base)
        {
            case tern_true:
                temp=tern_false;
                break;
            case tern_false:
                temp=tern_true;
                break;
            case tern_dontknow:
                temp=base;
                break;
        }
        return temp;
    }
    tern AND (tern t)
    {
        ternary temp;
        if (t.base==tern_true && this->base==tern_true) temp=tern_true;
        if (t.base==tern_false || this->base==tern_false) temp=tern_false;
        if (t.base==tern_dontknow && this->base==tern_dontknow) temp=tern_dontknow;
        if ((t.base==tern_dontknow || this->base==tern_dontknow) && (t.base==tern_true || this->base==tern_true)) temp=tern_dontknow;
        return tern(temp); 
    }
    tern OR (tern t)
    {
        ternary temp;
        if (this->base==tern_true || t.base==tern_true) temp=tern_true;
        if (this->base==tern_false && t.base==tern_false) temp=tern_false;
        if ((this->base==tern_dontknow || t.base==tern_dontknow) && (this->base==tern_false || t.base==tern_false)) temp = tern_dontknow;
        return temp;  
    }
    tern XOR (tern t)
    {
        ternary temp;
        if (t.AND(this).base==tern_true) temp=tern_false;
        if (t.AND(this).base==tern_dontknow) temp=tern_dontknow;
        if (t.OR(this).base==tern_dontknow) temp=tern_dontknow;
        if (t.base==tern_false && this->base==tern_false) temp=tern_false;
        if ((t.base==tern_true && this->base==tern_false) || (t.base==tern_false && this->base==tern_true)) temp=tern_true;
        return temp;
    }
    tern AND (tern *t)
    {
        ternary temp;
        if (t->base==tern_true && this->base==tern_true) temp=tern_true;
        if (t->base==tern_false || this->base==tern_false) temp=tern_false;
        if (t->base==tern_dontknow && this->base==tern_dontknow) temp=tern_dontknow;
        if ((t->base==tern_dontknow || this->base==tern_dontknow) && (t->base==tern_true || this->base==tern_true)) temp=tern_dontknow;
        return tern(temp); 
    }
    tern OR (tern *t)
    {
        ternary temp;
        if (this->base==tern_true || t->base==tern_true) temp=tern_true;
        if (this->base==tern_false && t->base==tern_false) temp=tern_false;
        if ((this->base==tern_dontknow || t->base==tern_dontknow) && (this->base==tern_false || t->base==tern_false)) temp = tern_dontknow;
        return temp;  
    }
    tern XOR (tern *t)
    {
        ternary temp;
        if (t->AND(this).base==tern_true) temp=tern_false;
        if (t->AND(this).base==tern_dontknow) temp=tern_dontknow;
        if (t->OR(this).base==tern_dontknow) temp=tern_dontknow;
        if (t->base==tern_false && this->base==tern_false) temp=tern_false;
        if ((t->base==tern_true && this->base==tern_false) || (t->base==tern_false && this->base==tern_true)) temp=tern_true;
        return temp;
    }
    tern operator ! (void)
    {
        return this->NOT();
    }
    tern operator && (tern t)
    {
        return this->AND(t);
    }
    tern operator || (tern t)
    {
        return this->OR(t);
    }
    const char* operator ~ (void)
    {
        return this->toString();
    }
    void operator << (tern t)
    {
        this->set(t.base);
    }
    void operator << (ternary t)
    {
        this->set(t);
    }
    void operator << (bool b)
    {
        this->set(b);
    }
    tern operator ^ (tern t)
    {
        return this->XOR(t);
    }
    tern operator == (tern t)
    {
        ternary temp;
        if (this->base==tern_dontknow || t.base==tern_dontknow) temp=tern_dontknow;
        if ((*this && t).base==tern_true) temp=tern_true;
        if (this->base == tern_false && t.base == tern_false) temp=tern_true;
        if ((*this ^ t).base==tern_true) temp=tern_false;
        return tern(temp);
    }
};
Добавлено через 2 часа 15 минут
Проблема решена. Решение: внутри нашего класса создаем дружественную ostream функцию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
friend std::ostream& operator << (std::ostream &o, tern const& t)
    {
        char *str;
        switch (t.base)
        {
            case tern_true:
                str = "true";
                break;
            case tern_false:
                str = "false";
                break;
            case tern_dontknow:
                str = "dontknow";
                break;
        }
        return o<<str;
    }
И с cout'ом все работает.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.08.2013, 23:31     Научить cout и printf работать со своим классом
Посмотрите здесь:

cout vs printf C++
cout & printf C++
printf и cout C++
printf > cout C++
Cout и printf C++
Замена (printf на cout) C++
Использование priority_queue со своим классом C++
C++ Замена printf на cout
Printf() - Cout C++
Переписать из printf в cout C++
Переделать cout на printf C++
C++ Замена printf на cout

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Форумчанин
Эксперт С++
4258 / 2790 / 219
Регистрация: 12.12.2009
Сообщений: 7,119
Записей в блоге: 1
Завершенные тесты: 1
29.08.2013, 13:35     Научить cout и printf работать со своим классом #2
Цитата Сообщение от ComputerMouse Посмотреть сообщение
Можно ли реализовать это хотя бы для одного из этих операторов?
а что ожидается на выходе? "false"/"true"? Можно так - определить operator char*() в своем классе и писать так
C++
1
printf("%s", (char*)a); // где a - это tern a
ComputerMouse
6 / 6 / 3
Регистрация: 06.11.2012
Сообщений: 254
29.08.2013, 13:36  [ТС]     Научить cout и printf работать со своим классом #3
Я уже решил проблему с cout'ом, а такой оператор сделал еще раньше.
fasked
Эксперт C++
4932 / 2512 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
31.08.2013, 10:42     Научить cout и printf работать со своим классом #4
Для gcc можно расширить printf - http://www.gnu.org/software/libc/man...ng-Printf.html
Yandex
Объявления
31.08.2013, 10:42     Научить cout и printf работать со своим классом
Ответ Создать тему
Опции темы

Текущее время: 14:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru