Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Редактирование программы http://www.cyberforum.ru/cpp/thread943742.html
Здравствуйте! Нужна помощь, есть программа, предназначенная открывать определённые файлы. В файлах информация содержится либо на английском языке, либо на русском. Программа распознаёт только...
C++ Функции-члены с "ref-qualifier" Собственно, компилируя с помощью g++ 4.8.1 следующий код #include <iostream> #include <type_traits> int main() { struct dummy { void one() {} http://www.cyberforum.ru/cpp/thread943630.html
Нужна библиотека Windows.h C++
Очень нужна библиотека Windows.h ввиде файлов с расширением .h Обратитесь к документации для вызываемой функции Windows. Определите имя константы, которую она использует, и имя H-файла (с...
C++ gSoap SSL
Здравствуйте! Может кто-нибудь подсказать как или где можно посмотреть настройку ssl в gSoap. Необходимо уметь забирать клиента wsdl по https и после сборки работать с сервером по https. В...
C++ Сделать плавающую кнопку, при нажатии на которую происходил бы переход на главную страницу http://www.cyberforum.ru/cpp/thread941971.html
Доброго времени суток! У меня такой вопрос, есть киоск для справок клиентов, на нём стоит Ubuntu, открыт браузер Google Chrome с сайтом. Мне нужно сделать плавающую кнопку при нажатии на которую...
C++ Интересная задача на предельные значения переменных Проинициализируйте переменнyю i таким образом, чтобы распечаталось слово. int i=???; int j = -i; if (i >= 0) exit(0); подробнее

Показать сообщение отдельно
ComputerMouse
6 / 6 / 3
Регистрация: 06.11.2012
Сообщений: 254

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

27.08.2013, 23:31. Просмотров 582. Ответов 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'ом все работает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.