2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2, 3  След.
 
 C++ наследование
Сообщение26.02.2016, 12:54 
Аватара пользователя


26/03/13
326
Russia
Пишу следующую программу для работы со строками

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include<iostream>
 using namespace std;
#include<cstring>
#include<process.h>
///////////////////////////////////////////////////////////
class String
{
 protected:
  enum { SZ = 80 };
  char str[SZ];
  int length;
 public:

 String() { str[0] = '\x0'; length=strlen(str); }
 String(char s[]) { strcpy(str, s); length=strlen(str); }
void display() const { cout << str <<endl; }
operator char*() { return str; }
};

class Pstring : public String
{
  public:
        Pstring(char s[]);
};

Pstring::Pstring(char s[])
{
 int n=strlen(s);
 if (n>SZ)
  for (int i=0;i<SZ;i++)
   str[i]=s[i];
 else
  strcpy(str,s);
}

class Pstring2 : public Pstring
{
 public:
        char* left(Pstring2 s1,int n);
        char* mid(Pstring2 s1,int s,int n);
        char* right(Pstring2 s1,int n);
};

char* Pstring2::left(Pstring2 s1,int n)
{
 if (n<=SZ)    
  for (int i=0;i<n;i++)
        str[i]=s1[i];
  else
  exit(1);      
 return str;
}

char* Pstring2::right(Pstring2 s1,int n)
{
 if (n<SZ)
  for (int i=0;i<n;i++)
   str[i]=s1[length-1-n+i];
 else
  exit(1);
 return str;   
}

char* Pstring2::mid(Pstring2 s1,int s,int n)
{
 if (n<SZ&&s<SZ&&n+s<SZ)
  for (int i=0;i<n;i++)
   str[i]=s1[s+i];
 else
  exit(1);     
 return str;
}

int main()
{
 Pstring2 str1,str2="Argentina";
 str1.right(str2,9);
 str1.display();  
 system("pause");
 return 0;     
}


при определении класса Pstring2 выдаёт ошибку, не понимаю в чём дело

 Профиль  
                  
 
 Re: C++ наследование
Сообщение26.02.2016, 13:08 
Заслуженный участник


09/05/12
25179
Вы бы еще написали, какую из многочисленных ошибок имеете в виду...

 Профиль  
                  
 
 Re: C++ наследование
Сообщение26.02.2016, 13:13 
Аватара пользователя


26/03/13
326
Russia
Многочисленных?

 Профиль  
                  
 
 Re: C++ наследование
Сообщение26.02.2016, 13:31 
Заслуженный участник
Аватара пользователя


06/10/08
6422
Ну если убрать process.h, который платформозависим, но из которого Вы ничего не используете, и заменить его на cstdlib, где определена exit, то остается две ошибки.

Первая по поводу отсутствия конструктора по умолчанию в Pstring, который нужен для конструктора по умолчанию в Pstring2. А вторая про отсутствие преобразования из const char [] в Pstring2, потому что у Pstring2 нет конструктора от чего-нибудь приводимого из const char [].

В общем, прочитайте где-нибудь, как работают и наследуются конструкторы.

К тому же, код сам по себе ужасен, и в С++ есть std::string, которая все это умеет, но это другой вопрос.

 Профиль  
                  
 
 Re: C++ наследование
Сообщение26.02.2016, 13:36 


19/03/09
129
Pstring имеет только один конструктор без конструктора по умолчанию Pstring().
Компилятор не может создать конструктор по умолчанию Pstring2() так как нет Pstring().
Или создать Pstring::Pstring() или определить типа Pstring2::Pstring2(const char*str=0);

 Профиль  
                  
 
 Re: C++ наследование
Сообщение27.02.2016, 21:45 
Аватара пользователя


26/03/13
326
Russia
Исправил конструкторы, теперь запускается

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include<iostream>
 using namespace std;
#include<cstring>
#include<cstdlib>
///////////////////////////////////////////////////////////
class String
{
 protected:
  enum { SZ = 80 };
  char str[SZ];
  int length;
 public:
  String():length(0) { str[0] = '\x0';}
  String(char s[]) { strcpy(str, s); length=strlen(str); }
  void display() const { cout << str <<endl; }
  operator char*() { return str; }
};
/////////////////////////////////////////////////////////////////
class Pstring : public String
{
  public:
        Pstring(): String() {}
        Pstring(char s[]);
};

Pstring::Pstring(char s[])
{
 int n=strlen(s);
 if (n>SZ)
  {
   for (int i=0;i<SZ;i++)
    str[i]=s[i];
   length=SZ;
  }
 else
 {
  strcpy(str,s);
  length=strlen(str);
 }
}
//////////////////////////////////////////////////////////////////////
class Pstring2 : public Pstring
{
 public:
        Pstring2(): Pstring(){ }
        Pstring2(char s[]):Pstring(s) { }
        char* left(Pstring2 s1,int n);
//      char* mid(Pstring2 s1,int s,int n);
//      char* right(Pstring2 s1,int n);
};

char* Pstring2::left(Pstring2 s1,int n)
{
 if (n<=SZ)
  {
        int i;
        for (i=0;i<n;i++)
         str[i]=s1[i];
    str[i+1]='\x0';
  }
 else
  exit(1);      
 return str;
}

/*
char* Pstring2::right(Pstring2 s1,int n)
{
 if (n<SZ)
  for (int i=0;i<n;i++)
   str[i]=s1[length-1-n+i];
 else
  exit(1);
 return str;   
}

char* Pstring2::mid(Pstring2 s1,int s,int n)
{
 if (n<SZ&&s<SZ&&n+s<SZ)
  for (int i=0;i<n;i++)
   str[i]=s1[s+i];
 else
  exit(1);     
 return str;
}
*/

/////////////////////// main  ///////////////////////////////////////////////
int main()
{
 Pstring2 str1,str2="Argentina";
 str1.left(str2,1);
 str2.display();
 str1.display();  
 system("pause");
 return 0;     
}


Но есть следующая проблема: функция left() должна копировать n левых символов из строки и вставлять в строку объекта. Здесь же она ещё добавляет что-то, можете объяснить почему?

 Профиль  
                  
 
 Re: C++ наследование
Сообщение27.02.2016, 22:34 
Заслуженный участник
Аватара пользователя


19/12/10
1546
Joe Black в сообщении #1102623 писал(а):
функция left() должна копировать n левых символов из строки и вставлять в строку объекта. Здесь же она ещё добавляет что-то, можете объяснить почему?

Используется синтаксис C++
int i;
for (i=0;i<n;i++) str[i]=s1[i];
str[i+1]='\x0';
Чему равно i после выхода из цикла? При каком значении n выражение str[i+1]='\x0' ошибочно?

(Оффтоп)

Чем '\0' отличается от '\x0'?

 Профиль  
                  
 
 Re: C++ наследование
Сообщение27.02.2016, 22:39 
Аватара пользователя


26/03/13
326
Russia
Понял, то есть после цикла i=1. Честно говоря не понимаю зачем нужно '\x0'. Вроде можно использовать '\0' как окончание строки

 Профиль  
                  
 
 Re: C++ наследование
Сообщение27.02.2016, 22:41 
Заслуженный участник
Аватара пользователя


30/01/06
72407

(Оффтоп)

Не ожидал, что встречу фильм ужасов в таком, казалось бы, спокойном месте...

 Профиль  
                  
 
 Re: C++ наследование
Сообщение27.02.2016, 22:58 
Аватара пользователя


26/03/13
326
Russia
Munin в сообщении #1102642 писал(а):

(Оффтоп)

Не ожидал, что встречу фильм ужасов в таком, казалось бы, спокойном месте...


(Оффтоп)

Вы наверное являетесь большим специалистом в программировании и для вас код новичка так сказать является фильмом ужасов. Нельзя быть специалистом во всём по-этому если вам не нравится "фильм ужасов" то его можно и не смотреть :-)


-- 27.02.2016, 22:59 --

Работает:

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
sing namespace std;
#include<cstring>
#include<cstdlib>
///////////////////////////////////////////////////////////
class String
{
 protected:
  enum { SZ = 80 };
  char str[SZ];
  int length;
 public:
  String():length(0) { str[0] = '\x0';}
  String(char s[]) { strcpy(str, s); length=strlen(str); }
  void display() const { cout << str <<endl; }
  operator char*() { return str; }
  int getlength() const {return length;}
};
/////////////////////////////////////////////////////////////////
class Pstring : public String
{
  public:
        Pstring(): String() {}
        Pstring(char s[]);
};

Pstring::Pstring(char s[])
{
 int n=strlen(s);
 if (n>SZ)
  {
   for (int i=0;i<SZ;i++)
    str[i]=s[i];
   length=SZ;
  }
 else
 {
  strcpy(str,s);
  length=strlen(str);
 }
}
//////////////////////////////////////////////////////////////////////
class Pstring2 : public Pstring
{
 public:
        Pstring2(): Pstring(){ }
        Pstring2(char s[]):Pstring(s) { }
        char* left(Pstring2 s1,int n);
        char* mid(Pstring2 s1,int s,int n);
        char* right(Pstring2 s1,int n);
};

char* Pstring2::left(Pstring2 s1,int n)
{
 if (n<=SZ)
  {
        int i;
        for (i=0;i<n;i++)
         str[i]=s1[i];
    str[i]='\0';
  }
 else
  exit(1);      
 return str;
}

char* Pstring2::right(Pstring2 s1,int n)
{
 if (n<SZ)
  {
  int i;
  for (i=0;i<n;i++)
   str[i]=s1[s1.getlength()-n+i];
  str[i]='\0';
  }
 else
  exit(1);
 return str;   
}

char* Pstring2::mid(Pstring2 s1,int s,int n)
{
 if (n<SZ&&s<SZ&&n+s<SZ)
  {
  int i;
  for (i=0;i<n;i++)
   str[i]=s1[s-1+i];
  str[i]='\0';
  }
 else
  exit(1);     
 return str;
}

/////////////////////// main  ///////////////////////////////////////////////
int main()
{
 Pstring2 str1,str2="Argentina";
 str1.mid(str2,1,1);
 str2.display();
 str1.display();  
 system("pause");
 return 0;     
}


Спасибо за помощь!

 Профиль  
                  
 
 Re: C++ наследование
Сообщение27.02.2016, 23:09 
Заслуженный участник


27/04/09
28128
Не хочется продолжать о фильмах, но всё-таки стоит называть вещи в коде более осмысленными именами или приделывать к ним сразу же комментарии (а если язык и редактор поддерживают документацию на месте — её), а лучше всё сразу. По одной только сигнатуре char* Pstring2::left(Pstring2 s1, int n) многого не угадать. Даже когда кажется, что код пишется один раз, и потом никто, и даже автор, в нём копаться не будет, это ощущение не всегда верно. Привычки за один день не появляются, поэтому стоит подумать уже сейчас.

 Профиль  
                  
 
 Re: C++ наследование
Сообщение27.02.2016, 23:43 
Заслуженный участник
Аватара пользователя


30/01/06
72407

(Оффтоп)

Joe Black в сообщении #1102649 писал(а):
для вас код новичка так сказать является фильмом ужасов.

Не всякий, не всякий. Тут от новичка особый талант нужен.

 Профиль  
                  
 
 Re: C++ наследование
Сообщение27.02.2016, 23:52 
Заслуженный участник
Аватара пользователя


19/12/10
1546
Joe Black в сообщении #1102641 писал(а):
то есть после цикла i=1
Полагаю, что вы хотели написать: i==n?

Используется синтаксис C++
if (n<=SZ)
  {
        int i;
        for (i=0;i<n;i++)
         str[i]=s1[i];
    str[i]='\0';
  }
Если n==SZ будет ли выражение str[i]='\0' верным?

 Профиль  
                  
 
 Re: C++ наследование
Сообщение28.02.2016, 00:14 
Аватара пользователя


26/03/13
326
Russia
Не будет, будет выход за границу массива

 Профиль  
                  
 
 Re: C++ наследование
Сообщение29.02.2016, 18:01 


21/10/15
196
Joe Black в сообщении #1102641 писал(а):
Честно говоря не понимаю зачем нужно '\x0'. Вроде можно использовать '\0' как окончание строки

'\0' - нулевой символ в восьмеричном виде,
'\x0' - нулевой символ в шестнадцатиричном виде.

Для нуля разницы нет.

Вообще можно и так:
Код:
str[i+1] = 0;

Но лучше не надо, так как с кавычками проще понять, что тут с символами работа идёт.

И ещё: немножко форматируйте. Самому проще будет:
Код:
if (n<SZ&&s<SZ&&n+s<SZ)

Хотя бы так:
Код:
if (n<SZ && s<SZ && n+s<SZ)

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 39 ]  На страницу 1, 2, 3  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group