С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

04.08.2010, 17:35. Просмотров 3590. Ответов 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() {

44
Евгений М.
1036 / 977 / 54
Регистрация: 28.02.2010
Сообщений: 2,829
Завершенные тесты: 2
04.08.2010, 17:48 #2
C++
1
Pstring g="Qwertythdththdhdhtdh";
Этот код не вызывает конструктор (точнее то что Вы бы хотели). Правильнее так вызывать в Вашем случае:
C++
1
Pstring g("Qwertythdththdhdhtdh");
Если хотите через знак равенства, тогда думаю лучше создать функцию operator =.
1
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
04.08.2010, 17:50  [ТС] #3
Спасибо за ответ, но к сожелению так я тоже пробывал
C++
1
Pstring g("Qwertythdththdhdhtdh");
Результат такой же.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
04.08.2010, 17:56 #4
Если вызывать в мейне вот так:

String t("bb");

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

String t("bb");

То переходит в тот конструктор куда и нужно...
Да в том то и дело что мну нужен обьект производного класса Pstring.
Он должен вызвать конструктор производного класса Pstring c параметром и если передаваемый параметр не выходит за границы, то конструктор производного класса Pstring вызывает конструктор с параметром базового класса String.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 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
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 - пустая
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 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
Эксперт С++
2305 / 1675 / 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) {
  }
};
0
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);  //Вызов конструктора с параметром не проиходит. 
        }
Да я собсно так и сделал, только по логике это не правильно, так как функцию копирования должен выполнить сам конструктор.
Уже неделю голову ломаю и читаю инет
0
CyBOSSeR
Эксперт С++
2305 / 1675 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.08.2010, 18:14 #11
Цитата Сообщение от LineStown Посмотреть сообщение
читаю инет
Читайте литературу и не "инет". Это есть в любой книге по C++.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 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
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++.
Как раз задача из книги хорошего автора Р.Лафоре.
Что самое смешное, там же есть и ответ, который не работает....
0
CyBOSSeR
Эксперт С++
2305 / 1675 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.08.2010, 18:18 #14
LineStown, перенесите проверки в конструктор базового класса.
0
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() программы для проверки
ее работы со строками разной длины.

Исходя из всего сказанного, я понял что так сделать нельзя.
Огромное спасибо всем за помошь
0
04.08.2010, 18:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.08.2010, 18:19
Привет! Вот еще темы с ответами:

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...


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

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

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