Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.05.2013, 16:45   #1
VitaliyH
 
Регистрация: 02.05.2013
Сообщений: 3
По умолчанию Виртуальный метод просмотра, метод (сравнение символьных массивов)

Доброго времени суток! Прошу помочь разобраться с заданием:
Цитата:
Напишите программу на языке программирования С++, которая должна содержать:
- базовый класс, включающий:
- два элемента в виде строк символов S1 и S2;
- конструктор с параметрами для создания динамических строковых объектов;
- деструктор;
- виртуальный метод просмотра текущего состояния объекта;
- производный класс, включающий:
- элемент в виде строки символов S3;
- конструктор с параметрами для создания динамических строковых объектов, передающий данные конструктору базового класса;
- переопределенный метод просмотра текущего состояния объектов;
- метод, реализующий следующую задачу: в самой длинной строке (считайте, что такая строка одна) из S1, S2 и S3 поменяйте местами первый и последний символы;
- функцию main, в которой создаются объекты и указатели на них, демонстрируется работа методов классов.
С классами и наследованием вроде бы разобрался. Вопросы следующие:
1. Правильно ли у меня реализовано "- виртуальный метод просмотра текущего состояния объекта;" и "- переопределенный метод просмотра текущего состояния объектов; ".
2. Нужен совет, как правильно написать функцию void find_change(- метод, реализующий следующую задачу:
в самой длинной строке (считайте, что такая строка одна) из S1, S2 и S3 поменяйте местами первый и последний символы). Пробовал s.length()думал сравнить значения и таким образом найти большую строку, но компилятор ругается на .length
Цитата:
D:\kr cpp 2\zadanie3\main.cpp|54|error: request for member 'length' in '((obj2*)this)->obj2::<anonymous>.obj1::s1', which is of non-class type 'char [64]'
если кому не сложно, прошу разъяснить ошибку.
нет необходимости писать за меня функцию, желательно объяснить как и что делать, чтобы я мог сам написать.
Код:
#include <iostream>
#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();
cout<<"asd: "<<i<<endl;
}
    int main()
{
obj2 string1("qweasdasasdsadasd","qwerty","qasdassadwer");

string1.show_obj2();
string1.find_change();


    return 0;
}
VitaliyH вне форума Ответить с цитированием
Старый 02.05.2013, 18:29   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

obj1::s1 (кстати, плохая идея называть тип именем obj-что-то, запутаетесь только так)... так вот, obj1::s1 имеет тип char[64]. Это базовый тип данных, не класс, и методов у него, соответственно, тоже нет. Поэтому, когда Вы пишете s1.length(), единственная реакция, которую в силах выдать компилятор - это "что-о-о?!".

Длина C-строки может быть определена библиотечной функцией strlen(). Обратите внимание, что для корректной работы strlen необходимо, чтобы строка в s1 была не длиннее 63 символов. Рекомендуется использовать strncpy() вместо strcpy() в конструкторах для обеспечения этого условия.
Abstraction вне форума Ответить с цитированием
Старый 03.05.2013, 11:50   #3
VitaliyH
 
Регистрация: 02.05.2013
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
obj1::s1 (кстати, плохая идея называть тип именем obj-что-то, запутаетесь только так)... так вот, obj1::s1 имеет тип char[64]. Это базовый тип данных, не класс, и методов у него, соответственно, тоже нет. Поэтому, когда Вы пишете s1.length(), единственная реакция, которую в силах выдать компилятор - это "что-о-о?!".

Длина C-строки может быть определена библиотечной функцией strlen(). Обратите внимание, что для корректной работы strlen необходимо, чтобы строка в s1 была не длиннее 63 символов. Рекомендуется использовать strncpy() вместо strcpy() в конструкторах для обеспечения этого условия.
спасибо, все получилось, и прога работает как надо.
может кому пригодится =)) :
Код:
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;}
}
VitaliyH вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод перебора, Метод дихотомии, Метод золотого сечения Delphi !!! OneBri Помощь студентам 0 03.10.2012 08:42
исследовать метод квадратных корней и метод Холецкого для решения СЛАУ Vит@x@ Помощь студентам 0 22.11.2011 10:47
Сравнение 2 столбцов (метод find) Костян Пират Microsoft Office Excel 7 17.11.2011 20:46
Turbo Pascal[програмыки : текстовая\метод симпсона\метод половинного деления qsccsq Помощь студентам 7 24.12.2010 05:23
Пузырьковый метод сортировки массивов Lunex.08 Общие вопросы C/C++ 4 07.10.2010 16:00