Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.65/20: Рейтинг темы: голосов - 20, средняя оценка - 4.65
LineStown
67 / 67 / 7
Регистрация: 04.08.2010
Сообщений: 423
Завершенные тесты: 1
1

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

04.08.2010, 17:35. Просмотров 3723. Ответов 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
Ответы с готовыми решениями:

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

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

Вызвать конструктор производного класса без конструктора базового класса
Здравствуйте! У меня есть базовый класс треугольник и производный класс...

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

Конструктор базового класса
Привет, друзья, есть, к примеру, такие классы: class Base { public: int...

44
Евгений М.
1053 / 990 / 101
Регистрация: 28.02.2010
Сообщений: 2,878
Завершенные тесты: 2
04.08.2010, 17:48 2
C++
1
Pstring g="Qwertythdththdhdhtdh";
Этот код не вызывает конструктор (точнее то что Вы бы хотели). Правильнее так вызывать в Вашем случае:
C++
1
Pstring g("Qwertythdththdhdhtdh");
Если хотите через знак равенства, тогда думаю лучше создать функцию operator =.
1
LineStown
67 / 67 / 7
Регистрация: 04.08.2010
Сообщений: 423
Завершенные тесты: 1
04.08.2010, 17:50  [ТС] 3
Спасибо за ответ, но к сожелению так я тоже пробывал
C++
1
Pstring g("Qwertythdththdhdhtdh");
Результат такой же.
0
ForEveR
В астрале
Эксперт С++
7996 / 4755 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
04.08.2010, 17:56 4
Если вызывать в мейне вот так:

String t("bb");

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

String t("bb");

То переходит в тот конструктор куда и нужно...
Да в том то и дело что мну нужен обьект производного класса Pstring.
Он должен вызвать конструктор производного класса Pstring c параметром и если передаваемый параметр не выходит за границы, то конструктор производного класса Pstring вызывает конструктор с параметром базового класса String.
0
ForEveR
В астрале
Эксперт С++
7996 / 4755 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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 пустая.
0
LineStown
67 / 67 / 7
Регистрация: 04.08.2010
Сообщений: 423
Завершенные тесты: 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 - пустая
0
ForEveR
В астрале
Эксперт С++
7996 / 4755 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
04.08.2010, 18:09 8
Ну. Можно побубнить например так

C++
1
2
3
4
5
 else
        {
            strcpy(str, s);
            String(str);  //Вызов конструктора с параметром не проиходит. 
        }
0
CyBOSSeR
Эксперт С++
2310 / 1683 / 148
Регистрация: 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) {
  }
};
0
LineStown
67 / 67 / 7
Регистрация: 04.08.2010
Сообщений: 423
Завершенные тесты: 1
04.08.2010, 18:12  [ТС] 10
Цитата Сообщение от Lavroff Посмотреть сообщение
Ну. Можно побубнить например так

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

C++
1
2
3
4
5
 else
        {
            strcpy(str, s);
            String(s);  //Вызов конструктора с параметром не проиходит. 
        }
Правда как это работает - я не представляю... В strcpy - строка s показывается пустой... Зато после s - то что нужно оО
1
LineStown
67 / 67 / 7
Регистрация: 04.08.2010
Сообщений: 423
Завершенные тесты: 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++.
Как раз задача из книги хорошего автора Р.Лафоре.
Что самое смешное, там же есть и ответ, который не работает....
0
CyBOSSeR
Эксперт С++
2310 / 1683 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
04.08.2010, 18:18 14
LineStown, перенесите проверки в конструктор базового класса.
0
LineStown
67 / 67 / 7
Регистрация: 04.08.2010
Сообщений: 423
Завершенные тесты: 1
04.08.2010, 18:19  [ТС] 15
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
LineStown, перенесите проверки в конструктор базового класса.
В том и состоит задача: написать кпроизводный класс для проверки длины строки.

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

Исходя из всего сказанного, я понял что так сделать нельзя.
Огромное спасибо всем за помошь
0
fasked
Эксперт С++
4982 / 2561 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
04.08.2010, 18:23 16
Цитата Сообщение от LineStown Посмотреть сообщение
Новый конструктор производного класса будет
копировать в str только SZ-1 символов, если строка окажется слишком длинной, и будет копировать строку
полностью, если она будет иметь длину меньшую, чем SZ. Напишите функцию main() программы для проверки
ее работы со строками разной длины.
а с чего вы взяли, что здесь необходимо вызывать конструктор базового класса?
0
CyBOSSeR
Эксперт С++
2310 / 1683 / 148
Регистрация: 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
67 / 67 / 7
Регистрация: 04.08.2010
Сообщений: 423
Завершенные тесты: 1
04.08.2010, 18:27  [ТС] 18
Цитата Сообщение от fasked Посмотреть сообщение
а с чего вы взяли, что здесь необходимо вызывать конструктор базового класса?
Ну если длинна строки меня устраивает, то по логике зачем мне вызывать копирование, если на это есть конструктор
Хотя с++ я только учусь и могу не совсем понимать механику
0
CyBOSSeR
Эксперт С++
2310 / 1683 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
04.08.2010, 18:29 19
LineStown, конструктор базового класса нужно вызвать только в одном месте - списке инициализации. Решение с strncpy наиболее подходит.
0
fasked
Эксперт С++
4982 / 2561 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
04.08.2010, 18:30 20
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
strncpy(str, s, SZ - 1);
длину входящей строки все таки надо бы проверить, вдруг меньше.
1
04.08.2010, 18:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.08.2010, 18:30

Конструктор базового класса
Такая проблема: имеется конструктор базового класса ErrorDataErrorData(ErrorCod...

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

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


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

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

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