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

Указатель на объект с перегруженным оператором вывода(с наследованием) - C++

Восстановить пароль Регистрация
 
k0z@k
37 / 37 / 7
Регистрация: 30.11.2011
Сообщений: 112
10.03.2013, 17:26     Указатель на объект с перегруженным оператором вывода(с наследованием) #1
Есть два класса: строка(базовый) и комплексное число(производный). В базовом классе есть поле stri (указатель на char). В производном классе есть перегруженный оператор вывода для этого поля.
Как следует написать этот оператор(или что-либо ещё изменить), чтобы он выдавал на экран stri, а не адрес памяти?

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
#include "stdafx.h"
#include "iostream"
using namespace std;
 
int ck=0,cf=0;
 
size_t strpos(const char *haystack,const char *needle) {
    int sleng=strlen(haystack);
    int nleng=strlen(needle);
    if (sleng!=0 && nleng!=0) {
        for (int i=0,j=0;i<sleng;j=0,i++) {
            while (i+j<sleng && j<nleng && haystack[i+j]==needle[j])
                j++;
            if (j==nleng)
                return i;
        }
    }
    else
        return -1;
}
 
bool isnum(char n) {
    char* ten=new char[10];
    strcpy(ten,"0123456789");
    if (strstr(ten,&n))
        return 1;
    else
        return 0;
}
 
class StringType {
protected:
    char *stri;
    int len;
public:
    StringType() {
        len=0;
        stri = new char[len];
    }
    StringType(char *stri) {
        len=strlen(stri);
        this->stri=stri;
    }
    virtual bool getcheckstate() {return 0;};
    ~StringType() {
        len=0;
        delete [] stri;
    }
    /*void setstr(char *stri) {
        len=strlen(stri);
        this->stri=stri;
    }*/
    char *getstr() {
        return stri;
    }
};
class tcomplex:public StringType {
private:
    int ipos;
    bool checkstate;
    int getpos() {
        return ipos;
    }
    bool check(char *compl) {
        for (int i=0;i<strlen(compl);i++) {
            if (compl[i]=='+' || compl[i]=='-' || compl[i]=='i' || isnum(compl[i]) ) {
                checkstate=1;
                return 1;
            }
        }
        checkstate=0;
        return 0;
    }
public:
    tcomplex():StringType("0i0"){
        ipos=1;
        checkstate=1;
    }
    tcomplex(char *compl):StringType(compl){
        if (check(compl)) {
            ipos=strpos(compl,"i");
        }
        else
            cout<<"Ошибка! Число задано неверно!"<<endl;
    }
    friend ostream& operator<<(ostream& os,StringType& compl) {
        //char *t=compl.getstr();
        os<<compl.getstr();
        return os;
    }
    ~tcomplex();
};
 
int main()
{
    StringType *f=new tcomplex("-4i+5");
    cout<<f<<endl;
    system("pause");
    return 0;
}
P.S. если при выводе при вывод делать таким образом
C++
1
cout<<*f<<endl;
то компилятор ругается - "отсутствует оператор соответствующий этим операндам"
компилю в вижуал студио 2010
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.03.2013, 17:26     Указатель на объект с перегруженным оператором вывода(с наследованием)
Посмотрите здесь:

C++ Не работает с оператором вывода
Ссылка, Указатель, Область памяти выделенная оператором new для указателя C++
Почему дружественная функция с перегруженным оператором << не имеет доступа к данным класса? C++
Указатель на объект. C++
Как исправить ошибку с перегруженным оператором C++
Как работает ссылка с объектами, классами и перегруженным оператором [] C++
Указатель на объект C++
Что значит константный указатель на объект, указатель на константный объект, и как это можно использовать? C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
10.03.2013, 17:50     Указатель на объект с перегруженным оператором вывода(с наследованием) #2
В в объявлении класса:
C++
1
2
     friend ostream& operator<<(ostream& os,StringType* & compl);
     friend ostream& operator<<(ostream& os,StringType & compl);
За классом:
C++
1
2
3
4
5
6
7
8
    ostream& operator<<(ostream& os,StringType* & compl) {
        os<<compl->getstr();
        return os;
    }
    ostream& operator<<(ostream& os,StringType & compl) {
        os<<compl.getstr();
        return os;
    }
Yandex
Объявления
10.03.2013, 17:50     Указатель на объект с перегруженным оператором вывода(с наследованием)
Ответ Создать тему
Опции темы

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