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

Не вызывается конструктор базового класса - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Заполнение массива числами от 1 до 25 без повторений http://www.cyberforum.ru/cpp-beginners/thread157355.html
#include <iostream> #include <ctime> using namespace std; int main() { const int ROW=5; const int COLUMN=5; int MAS; srand(time (NULL)); for (int i = 0; i < ROW; i++)
C++ Адресная арифметика Народ!!! Пожайлуста просвятите! Мне важно понять принцип хранения переменных различных типов данных в языках С++ и С#(например как в ячейках памяти будет храниться float a = 1234,33333)/ Зарание огромное спасибо http://www.cyberforum.ru/cpp-beginners/thread157322.html
Изменение указателя - аргумента функции C++
Привет всем! Может я совсем тупой, но не могу понять почему не работает такой пример: #include <iostream> void func (char * ptr) { ptr = new char ; ptr = '1';
C++ Как написать макрос - модуль числа...
Помогите написать макрос на с++, возвращающий модуль числа... Добавлено через 4 минуты Нашёл..
C++ Изменение значения статической переменной http://www.cyberforum.ru/cpp-beginners/thread157228.html
не дает =\ static char text; text = ""; error: expression must be a modifiable lvalue это же не конст, а просто статик, в pawn"е часто пользовался static и ок всё было
C++ Часы в псевдографике доброго времени суток. задание заключается в написании программы, отображающую на экране текущее время в виде циферблата с секундной,минутной и часовой стрелками(разных цветов). и сохранять картинку в файле по желанию пользователя. заранее благодарен. подробнее

Показать сообщение отдельно
VerDicT
0 / 0 / 0
Регистрация: 20.12.2011
Сообщений: 5
12.07.2012, 23:45     Не вызывается конструктор базового класса
Возмущает другое: если закаментить кусок кода:
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
#include <iostream>
#include <string.h>
 
using namespace std;
 
class String
{
    protected:
        enum {SZ = 80};
        char str[SZ];
    public:
        String()
        {
            str[0] = '\x0';
        }
        String(char s[])
        {
            strcpy(str, s);
        }
        void display() const
        {
            cout << str;
        }
        operator char*()
        {
            return str;
        }
};
 
class Pstring: public String
{
    public:
        Pstring(char s[])
        {
            if (strlen(s) >= SZ)
            {
                for (int i = 0; i < SZ - 1; i++)
                {
                    str[i] = s[i];
                }
                str[SZ - 1] = '\x0';
            }
            else
            {
                String(s);
            }
        }
};
 
int main ()
{
    Pstring s1 = "0123456789";
    s1.display();
    return 0;
}
то ругается
main.cpp||In constructor ‘Pstring::Pstring(char*)’:|
main.cpp|34|error: no matching function for call to ‘String::String()’|
main.cpp|16|note: candidates are: String::String(char*)|
main.cpp|7|note: String::String(const String&)|
main.cpp|45|error: no matching function for call to ‘String::String()’|
main.cpp|16|note: candidates are: String::String(char*)|
main.cpp|7|note: String::String(const String&)|
main.cpp||In function ‘int main()’:|
main.cpp|52|warning: deprecated conversion from string constant to ‘char*’|
||=== Build finished: 2 errors, 1 warnings ===|


и ещё: раз конструктор базового класса вызывается только в строке инициализации то почему бы не создать фиктивный конструктор производного класса, у которого в строке инициализации был бы нужный конструктор базового? см. ниже строки 33, 34 и 47
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
#include <iostream>
#include <string.h>
 
using namespace std;
 
class String
{
    protected:
        enum {SZ = 80};
        char str[SZ];
    public:
        String()
        {
            str[0] = '\x0';
        }
        String(char s[])
        {
            strcpy(str, s);
        }
        void display() const
        {
            cout << str;
        }
        operator char*()
        {
            return str;
        }
};
 
class Pstring: public String
{
    public:
        Pstring(char s[], bool b): String (s)
        {   }
        Pstring(char s[])
        {
            if (strlen(s) >= SZ)
            {
                for (int i = 0; i < SZ - 1; i++)
                {
                    str[i] = s[i];
                }
                str[SZ - 1] = '\x0';
            }
            else
            {
                Pstring(s, 1);
            }
        }
};
 
int main ()
{
    Pstring s1 = "0123456789";
    s1.display();
    return 0;
}
Но что бы вы думали? Толку нет, хотя s и передаётся в нужный базовый конструктор. Хелп!!!

И ещё вопрос: получается, Лафоре в своей книге привёл заведомо неправильный ответ?

З.Ы. Сей пример и призван проиллюстрировать то, что код используется дважды. Фишка как раз в том, чтобы запустить нужный конструктор базового класса, а не плодить повторы в коде (хоть конкретно в этом примере их и мало), что однако не получается.

Заранее спасибо.

Добавлено через 21 минуту
если закаментить кусок кода (в коде выше забыл закаментить):
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
#include <iostream>
#include <string.h>
 
using namespace std;
 
class String
{
    protected:
        enum {SZ = 80};
        char str[SZ];
    public:
       /* String()
        {
            str[0] = '\x0';
        }*/
        String(char s[])
        {
            strcpy(str, s);
        }
        void display() const
        {
            cout << str;
        }
        operator char*()
        {
            return str;
        }
};
 
class Pstring: public String
{
    public:
        Pstring(char s[])
        {
            if (strlen(s) >= SZ)
            {
                for (int i = 0; i < SZ - 1; i++)
                {
                    str[i] = s[i];
                }
                str[SZ - 1] = '\x0';
            }
            else
            {
                String(s);
            }
        }
};
 
int main ()
{
    Pstring s1 = "0123456789";
    s1.display();
    return 0;
}
 
Текущее время: 07:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru