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

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

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

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

04.08.2010, 17:35. Просмотров 3417. Ответов 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;
}
Поделитесь мыслью, что не так.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2010, 17:35     Не вызывается конструктор базового класса
Посмотрите здесь:

C++ Наследование(Не вызывается конструктор)
Будет ли утрачена память, когда конструктор копирования вызывается для уже существующего объекта класса? C++
C++ Конструктор базового класса
Не вызывается нужный конструктор базового класса C++
C++ При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О
Конструктор вызывается 2 раза C++
Конструктор базового класса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Евгений М.
1034 / 975 / 53
Регистрация: 28.02.2010
Сообщений: 2,818
Завершенные тесты: 2
04.08.2010, 17:48     Не вызывается конструктор базового класса #2
C++
1
Pstring g="Qwertythdththdhdhtdh";
Этот код не вызывает конструктор (точнее то что Вы бы хотели). Правильнее так вызывать в Вашем случае:
C++
1
Pstring g("Qwertythdththdhdhtdh");
Если хотите через знак равенства, тогда думаю лучше создать функцию operator =.
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
04.08.2010, 17:50  [ТС]     Не вызывается конструктор базового класса #3
Спасибо за ответ, но к сожелению так я тоже пробывал
C++
1
Pstring g("Qwertythdththdhdhtdh");
Результат такой же.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
04.08.2010, 17:56     Не вызывается конструктор базового класса #4
Если вызывать в мейне вот так:

String t("bb");

То переходит в тот конструктор куда и нужно...
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
04.08.2010, 18:00  [ТС]     Не вызывается конструктор базового класса #5
Цитата Сообщение от Lavroff Посмотреть сообщение
Если вызывать в мейне вот так:

String t("bb");

То переходит в тот конструктор куда и нужно...
Да в том то и дело что мну нужен обьект производного класса Pstring.
Он должен вызвать конструктор производного класса Pstring c параметром и если передаваемый параметр не выходит за границы, то конструктор производного класса Pstring вызывает конструктор с параметром базового класса String.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
04.08.2010, 18:04     Не вызывается конструктор базового класса #6
Такой код выдает ошибку: Error 2 error C2082: redefinition of formal parameter 's'

C++
1
2
3
4
5
6
7
8
9
10
11
12
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);  //Вызов конструктора с параметром не проиходит. 
                                     //Результат пустая строка
};
Если оставить if/else то к моменту вызова String(s) строка s пустая.
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
04.08.2010, 18:08  [ТС]     Не вызывается конструктор базового класса #7
Цитата Сообщение от Lavroff Посмотреть сообщение
Такой код выдает ошибку: Error 2 error C2082: redefinition of formal parameter 's'

C++
1
2
3
4
5
6
7
8
9
10
11
12
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);  //Вызов конструктора с параметром не проиходит. 
                                     //Результат пустая строка
};
Если оставить if/else то к моменту вызова String(s) строка s пустая.
Вот мне хотелось бы узнать, почему так происходит:
1.Почему идет переопределение S
2.Почему S - пустая
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
04.08.2010, 18:09     Не вызывается конструктор базового класса #8
Ну. Можно побубнить например так

C++
1
2
3
4
5
 else
        {
            strcpy(str, s);
            String(str);  //Вызов конструктора с параметром не проиходит. 
        }
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.08.2010, 18:12     Не вызывается конструктор базового класса #9
LineStown, коструктор базового класса можно вызвать только в списке инициализации:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class Base {
public:
  Base(const char* str) {
    // ...
  }
};
 
class Derived : public Base {
public:
  Derived(const char* str)
  : Base(str) {
  }
};
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
04.08.2010, 18:12  [ТС]     Не вызывается конструктор базового класса #10
Цитата Сообщение от Lavroff Посмотреть сообщение
Ну. Можно побубнить например так

C++
1
2
3
4
5
 else
        {
            strcpy(str, s);
            String(str);  //Вызов конструктора с параметром не проиходит. 
        }
Да я собсно так и сделал, только по логике это не правильно, так как функцию копирования должен выполнить сам конструктор.
Уже неделю голову ломаю и читаю инет
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.08.2010, 18:14     Не вызывается конструктор базового класса #11
Цитата Сообщение от LineStown Посмотреть сообщение
читаю инет
Читайте литературу и не "инет". Это есть в любой книге по C++.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
04.08.2010, 18:15     Не вызывается конструктор базового класса #12
LineStown, Кстати там можно и так:

C++
1
2
3
4
5
 else
        {
            strcpy(str, s);
            String(s);  //Вызов конструктора с параметром не проиходит. 
        }
Правда как это работает - я не представляю... В strcpy - строка s показывается пустой... Зато после s - то что нужно оО
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
04.08.2010, 18:17  [ТС]     Не вызывается конструктор базового класса #13
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
LineStown, коструктор базового класса можно вызвать только в списке инициализации:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class Base {
public:
  Base(const char* str) {
    // ...
  }
};
 
class Derived : public Base {
public:
  Derived(const char* str)
  : Base(str) {
  }
};
Это я тоже вроде бы как понимаю, но вот вызов конструктора зависит от параметра. Он как может вызватся, так может и не вызваться.

Добавлено через 1 минуту
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Читайте литературу и не "инет". Это есть в любой книге по C++.
Как раз задача из книги хорошего автора Р.Лафоре.
Что самое смешное, там же есть и ответ, который не работает....
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.08.2010, 18:18     Не вызывается конструктор базового класса #14
LineStown, перенесите проверки в конструктор базового класса.
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
04.08.2010, 18:19  [ТС]     Не вызывается конструктор базового класса #15
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
LineStown, перенесите проверки в конструктор базового класса.
В том и состоит задача: написать кпроизводный класс для проверки длины строки.

Вот само условие
Класс String в этом примере имеет дефект: у него нет защиты на тот
случай, если его объекты будут инициализированы слишком длинной строкой (константа SZ имеет значение 80).
Например, определение
String s = "Эта строка имеет очень большую длину и мы можем быть уверены, что она не уместится в
отведенный буфер, что приведет к непредсказуемым последствиям.";
будет причиной переполнения массива str строкой s с непредсказуемыми последствиями вплоть до краха системы.
Создадим класс Pstring, производный от класса String, в котором предотвратим возможность переполнения
буфера при определении слишком длинной строковой константы. Новый конструктор производного класса будет
копировать в str только SZ-1 символов, если строка окажется слишком длинной, и будет копировать строку
полностью, если она будет иметь длину меньшую, чем SZ. Напишите функцию main() программы для проверки
ее работы со строками разной длины.

Исходя из всего сказанного, я понял что так сделать нельзя.
Огромное спасибо всем за помошь
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
04.08.2010, 18:23     Не вызывается конструктор базового класса #16
Цитата Сообщение от LineStown Посмотреть сообщение
Новый конструктор производного класса будет
копировать в str только SZ-1 символов, если строка окажется слишком длинной, и будет копировать строку
полностью, если она будет иметь длину меньшую, чем SZ. Напишите функцию main() программы для проверки
ее работы со строками разной длины.
а с чего вы взяли, что здесь необходимо вызывать конструктор базового класса?
CyBOSSeR
Эксперт C++
2299 / 1669 / 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 здесь.
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
04.08.2010, 18:27  [ТС]     Не вызывается конструктор базового класса #18
Цитата Сообщение от fasked Посмотреть сообщение
а с чего вы взяли, что здесь необходимо вызывать конструктор базового класса?
Ну если длинна строки меня устраивает, то по логике зачем мне вызывать копирование, если на это есть конструктор
Хотя с++ я только учусь и могу не совсем понимать механику
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.08.2010, 18:29     Не вызывается конструктор базового класса #19
LineStown, конструктор базового класса нужно вызвать только в одном месте - списке инициализации. Решение с strncpy наиболее подходит.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.08.2010, 18:30     Не вызывается конструктор базового класса
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
04.08.2010, 18:30     Не вызывается конструктор базового класса #20
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
strncpy(str, s, SZ - 1);
длину входящей строки все таки надо бы проверить, вдруг меньше.
Yandex
Объявления
04.08.2010, 18:30     Не вызывается конструктор базового класса
Ответ Создать тему
Опции темы

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