1 / 7 / 3
Регистрация: 06.04.2011
Сообщений: 85
1

Помогите разобраться в Наследование

22.09.2011, 14:39. Показов 671. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
#include<iostream>
using namespace std;
class Counter1
{
protected:
    int count;
public:
    Counter1():count(0)
    {
    }
    Counter1(int c):count(c)
    {
    }
    int Get_count()
    {
        return count;
    }
    Counter1 operator++()//Префиксный
    {
        return Counter1(++count);
    }
};
class Counter2:public Counter1
{
public:
    Counter1 operator--()//Префиксный
    {
        return Counter1(--count);
    }
};
class Counter3:public Counter2
{
public:
    Counter1 operator++(int)//Постфиксный 
    {
        return Counter1(count++);
    }
    Counter1 operator--(int)//Постфиксный 
    {
        return Counter1(count--);
    }
};
int main()
{
    Counter3 C3;
    C3++;
    C3++;
    ++C3;   //Error
    C3--;
    --C3;   //Error
    return 0;
}
Не получается перегрузить Постфиксный инкремент, декремент в наследуемом классе.
Или вот еще один пример со строками

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
#include<iostream>
#include<cstring>
using namespace std;
class String1
{
protected:
    enum {SZ=80};
    char str[SZ];
public:
    String1()
    {
        str[0]='\0';
    }
    String1(char s[])
    {
        strcpy(str,s);
    }
    char display()const
    {
        return *str;
    }
    operator char*()
    {
        return str;
    }
};
class String2:public String1
{
public:
    String2()
    {
        str[0]='\0';
    }
    String2(char s[])
    {
        if(strlen(s)<SZ-1)
            String1(s);
        if(strlen(s)>SZ-1)
        {
            for(int j=0;j<SZ-1;j++)
                str[j]=s[j];
            str[SZ-1]='\0';
        }
    }
};
class String3:public String2
{
public:
    String3()
    {
        str[0]='\0';
    }
    String3(char s[])
    {
        String2(s);//Error Переопределение формального параметра "s" Пробовал так String2::String2(s); но тогда строки остаются пустыми
    }
    char& left(char s[],int n)//Добавление n символов в строку с лева
    {
        for(int i=0;i<n;i++)
            str[i]=s[i];
        str[n]='\0';
        return *str;
    }
    char& mid(char s[],int S,int n)//Добавление n символов в строку с символа S
    {
        for(int i=0,z=S;i<n;i++,z++)
            str[i]=s[z];
        str[n]='\0';
        return *str;
    }
    char& right(char s[],int n)//Добавление n символов в строку с права
    {
        for(int i=0,z=strlen(s)-n+1;i<n;i++,z++)
            str[i]=s[z];
        str[n]='\0';
        return *str;
    }
};
int main()
{
    String3 s1="This is a very long string which is probably no, certainly--going to exceed the limit set by SZ.";
    cout<<"\ns1="<<s1.display()<<endl;
    String3 s2="This is a short string.";
    cout<<"\ns2="<<s2.display()<<endl;
    cout<<endl;
    return 0;
}
Error Переопределение формального параметра "s" Пробовал так String2::String2(s); но тогда строки остаются пустыми
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.09.2011, 14:39
Ответы с готовыми решениями:

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

Не могу разобраться с ошибками, наследование и шаблоны
Задание: Смоделировать стек на базе статического массива по заданию. Написать основные операции...

Наследование. Помогите с этими public, protected. private
Вот код, в нем вылетает ошибка Unit2.cpp(16): E2251 Cannot find default constructor to initialize...

Помогите разобраться
У меня есть координаты North,West,East,South. Мне нужно отобразить их на осях ОХ и ОУ. Допустим я...

4
56 / 56 / 16
Регистрация: 01.08.2011
Сообщений: 141
22.09.2011, 15:59 2
Вот так попробуй.
C++
1
2
3
4
5
6
//...
        String3(char s[]) : String2(s)
        {
               
        }
//.....
0
1 / 7 / 3
Регистрация: 06.04.2011
Сообщений: 85
22.09.2011, 16:05  [ТС] 3
Ree.exe, Записывает только первый символ, а со второй строкой нечего не записывает.
0
56 / 56 / 16
Регистрация: 01.08.2011
Сообщений: 141
22.09.2011, 16:31 4
Вот немного переделал твой код.
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
#include<iostream>
#include<cstring>
using namespace std;
class String1
{
protected:
        enum {SZ=80};
        char str[SZ];
public:
        String1(const char* s="")
        {
            if(strlen(s)>79)
            {
                for(int i=0; i<79 ; i++)
                    str[i]=s[i];
                str[80-1]='\0';
            }
            else
                strcpy(str,s);
        }
        void display()const
        {
            cout<<str;
        }
};
/*  Зачем этот класс?
class String2:public String1
{
public:
        String2(const char* s="")
        {
                if(strlen(s)<SZ-1)
                        String1(s);
                if(strlen(s)>SZ-1)
                {
                        for(int j=0;j<SZ-1;j++)
                                str[j]=s[j];
                        str[SZ-1]='\0';
                }
        }
};
*/
class String3:public String1
{
public:
        
        String3(const char* s=""): String1(s)
        {
                
        }
        char& left(char s[],int n)//Добавление n символов в строку с лева
        {
                for(int i=0;i<n;i++)
                        str[i]=s[i];
                str[n]='\0';
                return *str;
        }
        char& mid(char s[],int S,int n)//Добавление n символов в строку с символа S
        {
                for(int i=0,z=S;i<n;i++,z++)
                        str[i]=s[z];
                str[n]='\0';
                return *str;
        }
        char& right(char s[],int n)//Добавление n символов в строку с права
        {
                for(int i=0,z=strlen(s)-n+1;i<n;i++,z++)
                        str[i]=s[z];
                str[n]='\0';
                return *str;
        }
};
int main()
{
    setlocale(LC_ALL,"");
        String3 s1("This is a very long string which is probably no, certainly--going to exceed the limit set by SZ.");
        cout<<"\ns1=";
        s1.display();
        String3 s2="This is a short string.";
        cout<<"\ns2=";
        s2.display();
        cout<<endl;
        return 0;
}
0
1 / 7 / 3
Регистрация: 06.04.2011
Сообщений: 85
22.09.2011, 16:46  [ТС] 5
Это должно быть множественное наследование, сначала есть класс String1 который не делает проверку на выход из строки, его наследует класс String2 который делает проверку, и класс String3 который наследует String2 и добавляет методы left nid right
Вся проблема в классе String2, с короткой строкой конструктор с параметром класса String1 не запускается.
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
#include<iostream>
#include<cstring>
using namespace std;
class String1
{
protected:
        enum {SZ=80};
        char str[SZ];
public:
        String1()
        {
                str[0]='\0';
        }
        String1(char s[])
        {
                strcpy(str,s);
        }
        void display()
        {
                cout<<str;
        }
};
class String2:public String1
{
public:
        String2()
        {
                str[0]='\0';
        }
        String2(char y[])
        {
                if(strlen(y)>SZ-1)
                {
                        for(int j=0;j<SZ-1;j++)
                                str[j]=y[j];
                        str[SZ-1]='\0';
                }
                if(strlen(y)<SZ-1)
                    String1(y);     // НЕ РАБОТАЕТ
        }
};
int main()
{
        String2 s1="This is a very long string which is probably no, certainly--going to exceed the limit set by SZ.";
        cout<<"\ns1=";
        s1.display();
 
        String2 s2="This is a short string.";   //Строка 2 пустая в нее нечего не записываеться
        cout<<"\ns2=";
        s2.display();
 
        cout<<endl;
        return 0;
}
0
22.09.2011, 16:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.09.2011, 16:46
Помогаю со студенческими работами здесь

If else помогите разобраться
Доброго времени суток всем. Не так давно начали программировать в C++ MS Visual Studio 2010? и...

Помогите разобраться с шаблонами
Пытаюсь реализовать новую для себя методику &quot;службы класса&quot;. Все хорошо работало, пока не возникла...

Помогите разобраться в коде
Помогите мне разобраться в коде. Заранее спасибо. int seek_substring_KMP (char s, char p) { int...

Помогите разобраться со структурами
Приветствую всех! :) Мне дали очередное задание с которым, конешноже я не могу самостоятельно...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru