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, Супермодераторы



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

Сейчас этот форум просматривают: Mikhail_K


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

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