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

Наследование, виртуальный метод просмотра, метод (сравнение символьных массивов) - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Операции над строкой. Подсчитать количество слов, которое начинается с той буквы, которой заканчивается предыдущее слово http://www.cyberforum.ru/cpp-beginners/thread854051.html
Дано предложение, слова в нем разделены пробелами. Подсчитать количество слов, которое начинается с той буквы, которой заканчивается предыдущее слово. Если таких слов больше половины, то их необходимо перенести в конец предложения. Если я ввожу строку : okno opera stryna argentina akter программа выводит: okno stryna opera argentina akter. Но если пробую: okno teatr rabota africa akter то...
C++ Как переделать на консоль? данная задача сделано в форме, нужно чтоб все тодже самое, считалось в консоли //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) http://www.cyberforum.ru/cpp-beginners/thread854048.html
Вычисление дискриминанта C++
Вроди простая программа но почему то работает некоректно не пойму в чем причина С++ #include "stdafx.h" #include <iostream> #include <string> #include <windows.h> #include <fstream> #include <math.h> using namespace std; bool Discrim () {
Error: jump to case label C++
Здравствуйте. Не один раз встречался с такой ошибкой. Сам не знаю, что она означает, но выправлял я ее с помощью if вместо switch - case. Так вот: здесь уже так у меня не получиться так исправить. Поясните пожалуйста, что эта ошибка означает и как ее исправить. #include <iostream> #include <conio.h> #include <vector> #include <cstdlib> enum KEYS { SPACE = 32, ENTER = 13, BACKSPACE = 8 };...
C++ Дерево результатов футбольных соревнований http://www.cyberforum.ru/cpp-beginners/thread854027.html
Нужно сделать дерево результатов футбольных соревнований. В моем случае это футбол. Турнир должен выглядеть как Лига Чемпионов. Групповой этап, плей-офф и финал. Голы, которые забили команды, должны задаваться рандомно. Сделал плей-офф, но он не работает так как надо. Подскажите, каким образом лутше всего это реализовать? #include <iostream> using namespace std; class championleague {...
C++ Построить класс для управления базой данных колекции марок. Используйте следующие поля класса: Построить класс для управления базой данных колекции марок. Используйте следующие поля класса: char stamp_title; //название коллекции char country; // название страны марки int count_of_stamps; // количество марок этой страны int total_format; // формат(1-квадрат,2-треугольник,3-овал) Определите методы для ввода данных с клавиатуры, для вывода их на экран. Создайте несколько... подробнее

Показать сообщение отдельно
VitaliyH
3 / 3 / 0
Регистрация: 05.09.2012
Сообщений: 41
03.05.2013, 11:58     Наследование, виртуальный метод просмотра, метод (сравнение символьных массивов)
Доброго времени суток! Прошу помочь разобраться с заданием:
Напишите программу на языке программирования С++, которая должна содержать:
- базовый класс, включающий:
- два элемента в виде строк символов S1 и S2;
- конструктор с параметрами для создания динамических строковых объектов;
- деструктор;
- виртуальный метод просмотра текущего состояния объекта;
- производный класс, включающий:
- элемент в виде строки символов S3;
- конструктор с параметрами для создания динамических строковых объектов, передающий данные конструктору базового класса;
- переопределенный метод просмотра текущего состояния объектов;
- метод, реализующий следующую задачу:
в самой длинной строке (считайте, что такая строка одна) из S1, S2 и S3 поменяйте местами первый и последний символы;
- функцию main, в которой создаются объекты и указатели на них, демонстрируется работа методов классов.
С классами и наследованием вроде бы разобрался. Вопросы следующие:
1. Правильно ли у меня реализовано "- виртуальный метод просмотра текущего состояния объекта;" и "- переопределенный метод просмотра текущего состояния объектов; ".
2. Нужен совет, как правильно написать функцию void find_change(- метод, реализующий следующую задачу:
в самой длинной строке (считайте, что такая строка одна) из S1, S2 и S3 поменяйте местами первый и последний символы). Пробовал s.length()думал сравнить значения и таким образом найти большую строку получил
error: request for member 'length' in '((obj2*)this)->obj2::<anonymous>.obj1::s1', which is of non-class type 'char [64]'
если кому не сложно, прошу разъяснить ошибку.
нет необходимости писать за меня функцию, желательно написать как и что делать, чтобы я мог сам написать.
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
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <string.h>
#include <string>
using namespace std;
 
class obj1
{    public:
    obj1(char*,char*);   //конструктор
   ~obj1(void);                  //деструктор
    virtual void show_obj1(void);  //прототип функфии(метод)
    protected:
    char s1[64];
    char s2[64];
};
    obj1::obj1(char *s1,char *s2) //определение конструктора
    {
        strcpy(obj1::s1,s1);
        strcpy(obj1::s2,s2);
    }
    obj1::~obj1(void)
    {
        cout<<"unichtojenie s1: "<<s1<<endl;
        cout<<"unichtojenie s2: "<<s2<<endl;
    }
    void obj1::show_obj1(void)    //функция просмотра
 {
    cout<<"s1: "<<s1<<endl;
    cout<<"s2: "<<s2<<endl;
    }
 
class obj2: public obj1      //производный класс
{public:
    obj2(char*,char*,char*);
    ~obj2(void);
 
    void show_obj2();
    void find_change();
    private:
    char s3[64];
};
obj2::obj2(char *s1,char *s2,char *s3):obj1(s1,s2)
{
    strcpy(obj2::s3,s3);
}
obj2::~obj2(void)
    {
        cout<<"unichtojenie s3: "<<s3<<endl;
    }
void obj2::show_obj2(void)        //переопределенный метод просмотра текущего состояния объектов
{show_obj1();
    cout<<"s3: "<<s3<<endl;
}
void obj2::find_change()
{int i = s1.length();
/*if (s1>s2 && s1>s3)
cout<<"Otrabotala funkciya s1 bolshe: "<<s1<<endl;
else if (s2>s1 && s2>s3)
cout<<"Otrabotala funkciya s2 bolshe: "<<s2<<endl;
else
cout<<"Otrabotala funkciya s3 bolshe: "<<s3<<endl;*/
 
}
    int main()
{
obj2 string1("qweasdasasdsadasd","qwerty","qasdassadwer");
 
string1.show_obj2();
string1.find_change();
 
    return 0;
}
Добавлено через 20 часов 9 минут
Все, проблема решена ! Добрые люди на **************** разъяснили ошибку. Печаль что на cyberforum не нашлось не кого кто мог бы разъяснить такую ошибку, но я это сейчас исправлю
obj1::s1 (кстати, плохая идея называть тип именем obj-что-то, запутаетесь только так)... так вот, obj1::s1 имеет тип char[64]. Это базовый тип данных, не класс, и методов у него, соответственно, тоже нет. Поэтому, когда Вы пишете s1.length(), единственная реакция, которую в силах выдать компилятор - это "что-о-о?!".

Длина C-строки может быть определена библиотечной функцией strlen(). Обратите внимание, что для корректной работы strlen необходимо, чтобы строка в s1 была не длиннее 63 символов. Рекомендуется использовать strncpy() вместо strcpy() в конструкторах для обеспечения этого условия.
может кому пригодится:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void obj2::find_change()
{int a = strlen(s1);
 int b = strlen(s2);
 int c = strlen(s3);
 char temp;
 if (a>b && a>c)
 {temp = s1[0];
 s1[0]=s1[strlen(s1) -1];
 s1[strlen(s1) -1] = temp;
 cout<<"Stroka 1 bolshe: "<<s1<<endl<<endl;}
 else if (b>a && b>c)
 {temp = s2[0];
 s2[0]=s2[strlen(s2) -1];
 s2[strlen(s2) -1] = temp;
 cout<<"Stroka 2 bolshe: "<<s2<<endl<<endl;}
 else
 {temp = s3[0];
 s3[0]=s3[strlen(s3) -1];
 s3[strlen(s3) -1] = temp;
 cout<<"Stroka 3 bolshe: "<<s3<<endl<<endl;}
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 08:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru