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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 5.00
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
#1

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

04.08.2010, 17:35. Просмотров 3485. Ответов 44
Метки нет (Все метки)

Доброго времени суток.
У меня проблема:в производном классе не вызывается конструктор базового класса.
Думаю описывать класс не стоит, т.к. он простейший.

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
#include<iostream>
#include<cstring>
using namespace std;
class String
{
protected:
    enum {SZ=80};
    char str[SZ];
public:
    String()
    {
        str[0]='\0';
    }
    String(char s[])
    {
        strcpy(str,s);
    }
    void display()const
    {
        cout << str << endl;
    }
};
class Pstring:public String
{
public:
    Pstring(char s[]);
};
Pstring::Pstring(char s[])
{
    if(strlen(s)>SZ-1)
    {
        for(int j=0;j<SZ;j++)
        str[j]=s[j];
        str[SZ-1]='\0';
    }
    else
        String(s);  //Вызов конструктора с параметром не проиходит. 
                                     //Результат пустая строка
};
int main()
{
    Pstring g="Qwertythdththdhdhtdh";
    g.display();
    return 0;
}
Поделитесь мыслью, что не так.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2010, 17:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не вызывается конструктор базового класса (C++):

Не вызывается нужный конструктор базового класса - C++
Здравствуйте. Я пока в процессе изучения С++. Имеется следующая структура классов: Базовый: Person, расширяющие его: Student и...

При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О - C++
Вот такой кодclass A { public: A(){} virtual ~A(){} }; class C { public:

Наследование: почему вызывается метод базового класса, а не производного? - C++
Всем привет, такой вопрос, почему вызывается в данном коде метод базового класса, а не производного (без указания ключевого слова virtual...

Конструктор базового класса - C++
Привет, друзья, есть, к примеру, такие классы: class Base { public: int x; Base() { } };

Конструктор базового класса - C++
Такая проблема: имеется конструктор базового класса ErrorDataErrorData(ErrorCod cod, bool isFatal);, где ErrorCod вот такая...

Будет ли утрачена память, когда конструктор копирования вызывается для уже существующего объекта класса? - C++
class A { char * v; A(); ~A(); A(const A &amp;obj); } ///////////////////// A::A() {

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
fasked
Эксперт С++
4937 / 2517 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
04.08.2010, 18:23 #16
Цитата Сообщение от LineStown Посмотреть сообщение
Новый конструктор производного класса будет
копировать в str только SZ-1 символов, если строка окажется слишком длинной, и будет копировать строку
полностью, если она будет иметь длину меньшую, чем SZ. Напишите функцию main() программы для проверки
ее работы со строками разной длины.
а с чего вы взяли, что здесь необходимо вызывать конструктор базового класса?
0
CyBOSSeR
Эксперт C++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.08.2010, 18:23 #17
LineStown, вызов конструктора здесь ни к чему:
C++
1
2
3
Pstring::Pstring(char s[]) {
  strncpy(str, s, SZ - 1);
}
Описание strncpy здесь.
1
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
04.08.2010, 18:27  [ТС] #18
Цитата Сообщение от fasked Посмотреть сообщение
а с чего вы взяли, что здесь необходимо вызывать конструктор базового класса?
Ну если длинна строки меня устраивает, то по логике зачем мне вызывать копирование, если на это есть конструктор
Хотя с++ я только учусь и могу не совсем понимать механику
0
CyBOSSeR
Эксперт C++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.08.2010, 18:29 #19
LineStown, конструктор базового класса нужно вызвать только в одном месте - списке инициализации. Решение с strncpy наиболее подходит.
0
fasked
Эксперт С++
4937 / 2517 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
04.08.2010, 18:30 #20
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
strncpy(str, s, SZ - 1);
длину входящей строки все таки надо бы проверить, вдруг меньше.
1
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
04.08.2010, 18:32  [ТС] #21
CyBOSSeR, Спасибо, я понял, что только список инициализации вызовет конструктор.
Тему можно закрывать
0
CyBOSSeR
Эксперт C++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.08.2010, 18:32 #22
fasked, точно. Поторопился.
0
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
04.08.2010, 18:35  [ТС] #23
C++
1
2
3
4
if(strlen(s)>SZ-1)
strncpy(str,s,SZ-1);
else
strcpy(str,s);
Вот так оптимально
0
Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
04.08.2010, 18:40 #24
C
1
String(s).display();
Попробуйте такой вариант для оптимальности.
0
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
04.08.2010, 18:45  [ТС] #25
Цитата Сообщение от Sekt Посмотреть сообщение
C
1
String(s).display();
Попробуйте такой вариант для оптимальности.
При таком вызове, мой обьект в main, после инициализации будет иметь пустое значение.
0
Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
04.08.2010, 18:50 #26
Если в вашем коде сменить строку String(s) на
String(s).display();
Будет пустое значение?
Значет у нас совсем разные компиляторы.
0
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
04.08.2010, 18:58  [ТС] #27
Цитата Сообщение от Sekt Посмотреть сообщение
Если в вашем коде сменить строку String(s) на
String(s).display();
Будет пустое значение?
Значет у нас совсем разные компиляторы.
Если заменить так, как Вы написали, то значение выведется в консоль, но сам обьект не будет содержать значение.
ЗЫ Компилятор MVS2010
0
Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
04.08.2010, 19:01 #28
Цитата Сообщение от LineStown Посмотреть сообщение
но сам обьект не будет содержать значение
Да т.к в String(s).display(); создается конструктор по-умолчанию.Что было обговорено здесь раннее.
0
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
05.08.2010, 09:51  [ТС] #29
Цитата Сообщение от Sekt Посмотреть сообщение
Да т.к в String(s).display(); создается конструктор по-умолчанию.Что было обговорено здесь раннее.
Но если обьект не получил значение, но каким образом отработал конструктор?
0
VerDicT
0 / 0 / 0
Регистрация: 20.12.2011
Сообщений: 5
12.07.2012, 23:45 #30
Возмущает другое: если закаментить кусок кода:
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;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2012, 23:45
Привет! Вот еще темы с ответами:

this(Всегда ли вызывается конструктор при не явной передачи объекта в конструктор) - C++
class Test { int i; public: void test(int i) { this -&gt; i = i; } }; Конструктор Test::Test всегда вызывается...

Конструктор класса не видит конструктор по умолчанию другого класса - C++
Ошибка, естественно, в Classes.cpp, в строке 20. Ругается, что у класса TailNode нет конструктора по умолчанию, хотя он там, конечно, есть....

Не вызывается конструктор - C++
Есть конструктор, который я вызываю если, число, которое я передаю больше 20. Конструктор должен к нулю приравнять значение, но почему то...

Конструктор вызывается 2 раза - C++
Помогите пожалуйста найти ошибку. Конструктор вызывается 2 раза. #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;fstream&gt; using...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.07.2012, 23:45
Ответ Создать тему
Опции темы

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