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

C++

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

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

27.08.2013, 23:31. Просмотров 577. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.08.2013, 23:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Научить cout и printf работать со своим классом (C++):

Как работать с TObject классом-наследником - C++ Builder
Я не могу найти как правильно создавать свой класс TObject. Может кто подскажет? Есть у TIdTCPServer AContext-&gt;Data которая по типу...

printf > cout - C++
Помогите переделать printf(&quot;| %3.2f | %3.1f | %7.5f |\n&quot;,a,b,y); на cout.

printf и cout - C++
У меня возник вопрос, что луче еспользовать в C++, printf/scanf или cout/cin ? Что работает быстрее? Есть такой фрагмент кода ...

cout vs printf - C++
Что лучше и удобней использывать в написаннии программ? cout или printf?

Printf() - Cout - C++
Простой вопрос. Как заменить printf (&quot;%09d&quot;, a); на cout?

Cout и printf - C++
Привет форумчане, не могу разобраться как правильно записать выражение использую не printf, a cout. Вот исходное выражение: printf(&quot;H:...

3
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,355
Записей в блоге: 2
Завершенные тесты: 1
29.08.2013, 13:35 #2
Цитата Сообщение от ComputerMouse Посмотреть сообщение
Можно ли реализовать это хотя бы для одного из этих операторов?
а что ожидается на выходе? "false"/"true"? Можно так - определить operator char*() в своем классе и писать так
C++
1
printf("%s", (char*)a); // где a - это tern a
0
ComputerMouse
6 / 6 / 3
Регистрация: 06.11.2012
Сообщений: 254
29.08.2013, 13:36  [ТС] #3
Я уже решил проблему с cout'ом, а такой оператор сделал еще раньше.
0
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
31.08.2013, 10:42 #4
Для gcc можно расширить printf - http://www.gnu.org/software/libc/man...ng-Printf.html
2
31.08.2013, 10:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.08.2013, 10:42
Привет! Вот еще темы с ответами:

Использование priority_queue со своим классом - C++
Если в классе перегрузить оператор '&gt;', то можно использовать такую конструкцию? priority_queue &lt;Class, vector &lt;Class&gt;, greater &lt;Class&gt;&gt;...

Переделать cout на printf - C++
cout&lt;&lt;x&lt;&lt;&quot; &quot;;

Замена printf на cout - C++
Ув. коллеги, Можно ли заменить printf на cout в последнем выражении тернарного оператора (строка 13) без создания новой функции? ...

Отличие cout от printf - C++
Всем добрый день! у меня такой вопрос: чем отличается cout от printf? у меня есть программа, если я printf заменяю на cout, то выводит...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

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