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

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

Войти
Регистрация
Восстановить пароль
 
Archeeey
7 / 7 / 1
Регистрация: 21.03.2011
Сообщений: 34
#1

Вопрос по наследованию - C++

21.03.2011, 19:27. Просмотров 341. Ответов 5
Метки нет (Все метки)

Вопрос насчёт передачи аргументов в конструктор базового класса(создания временного объекта), а именно почему у меня это не выходит и где у меня ошибка?


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
#include "stdafx.h"
#include <iostream>
#include <string.h>
using namespace std;
 
class ch
{
protected:
    enum{size = 10};
    char str[size];
public:
    ch ()
    {str[0] = '\0';}
    ch (char s[])
    {strcpy(str,s);}
 
    void view()
    {cout << str;}
 
};
 
class Pstring:public ch
{
public:
    Pstring ():ch()
    {}
    Pstring(char s[]) 
    {
        int i ;
        int n = strlen(s);
        if (n > size)
        {
            for ( i = 0 ; i < size-1;i++)
                str[i]= s[i];
            str[i] = '\0';
        }
        else
            ch (s);       //ошибка как мне кажется тут
    }   
};
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    Pstring s1,s2;
    char ch[] = "7896";
    s1 = ch;
    s1.view();
 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2011, 19:27     Вопрос по наследованию
Посмотрите здесь:

Вопрос по наследованию - C++
Уже неоднократно перечитывал главы про наследования и все равно до конца не разобрался. Вот например у нас есть класс Четырехугольник, и...

Вопросы по наследованию - C++
Вопрос ещё по конструкторам Допустим есть система классов class A { public: A() {} }; class B: public A {

Задание по наследованию классов - C++
Создать иерархию классов : линия - прямоугольник - пирамида. Все классы должны содержать методы для фиксации и получения значений всех...

Задача по наследованию в C++, нужно реализовать некоторые моменты - C++
Написать программу с объектами и реализовать наследование. Ситуация: Klimat (базовый объект), Derevo (выводной объект). a. Klimat:...

Задача по наследованию. Не понимаю некоторые моменты в формулировке задания - C++
Здравствуйте! Вот есть задание: Описать базовый класс СТРОКА Обязательные поля класса: # Указатель на char - хранит адрес...

"Предпочитайте композицию наследованию" - C++
Привет. В книге &quot;Стандарты программирования на С++&quot; есть совет 34: &quot;Предпочитайте композицию наследованию&quot; Хочу уточнить на счет...

Вопрос - C++
Приветствую Вас! 1. Необходимо просто описать как это должно работать: Дано: {max (a,b), y= {min(a,b), {|a+b|, если х=0,...

Вопрос - C++
Такая задача возникла... Есть класс например: class tempClass { public: const int size; tempClass(){size=100;} };

Вопрос по #if - C++
const LEVEL = 4; #if LEVEL == 5 cout &lt;&lt;5&lt;&lt;endl; #elif LEVEL == 4 cout &lt;&lt;4&lt;&lt;endl; #else cout...

Вопрос по функциям - C++
Есть функция: int fun(char wob, unsigned char s, char name, char opis, uint32_t code) {} Я вызываю её в одном месте приложения: int...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
21.03.2011, 19:44     Вопрос по наследованию #2
Ошибок нет, есть непонимание того, что такое конструктор. Вы в строке 38 конструируете объект в никуда. Он создаётся и, поскольку имени не имеет, тут же уничтожается. Правильный вариант такой:
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
#include <iostream>
#include <string.h>
using namespace std;
 
class ch
{
protected:
        enum{size = 10};
        char str[size];
public:
        ch ()
        {str[0] = '\0';}
        ch (char s[])
        {strcpy(str,s);}
 
        void view()
        {cout << str;}
 
};
 
class Pstring:public ch
{
public:
        Pstring ():ch()
        {}
        
        Pstring(char s[]):
        ch(s)
        {
        }
};
 
 
 
int main()
{
        Pstring s1,s2;
        char ch[] = "7896";
        s1 = ch;
        s1.view();
 
        return 0;
}
Так и никак больше надо делать потому, что список инициализации и только он может инициализировать переменные родительского класса из дочернего посредством конструктора. Иначе вам в конструкторе Pstring пришлось бы повторить код конструктора ch.
lavan
51 / 51 / 1
Регистрация: 21.03.2009
Сообщений: 371
21.03.2011, 19:50     Вопрос по наследованию #3
Конструктор б.к должен быть инициализирован до входа в тело констр п.к
C++
1
2
 Pstring(char s[]) 
        {}
был вызван конструктор по умолчанию б.к
а здесь
C++
1
2
else
 ch (s);
неименнованный объект
Archeeey
7 / 7 / 1
Регистрация: 21.03.2011
Сообщений: 34
21.03.2011, 20:00  [ТС]     Вопрос по наследованию #4
спс, про конструкторы надо перечитать, насчет списка инициализации запомнил.
Хотя странно:в ответах в книге Лафоре код такой же как и у меня в 38 строке(создается временный объект в никуда ). Выкинуть Лафоре?
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
21.03.2011, 20:07     Вопрос по наследованию #5
А какая страница? Глянуть хочется, может там что-то другое подразумевалось?

Добавлено через 3 минуты
Уже увидел. Подозреваю, что это либо намеренная ошибка, либо (в чём сомневаюсь) раньше (до стандарта) так можно было делать о_О
Archeeey
7 / 7 / 1
Регистрация: 21.03.2011
Сообщений: 34
21.03.2011, 20:08  [ТС]     Вопрос по наследованию #6
еще раз спс.)
Yandex
Объявления
21.03.2011, 20:08     Вопрос по наследованию
Ответ Создать тему
Опции темы

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