Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Возврат по ссылке и error C2440

29K
28 апреля 2009 года
EXAngel
29 / / 08.07.2008
Вот формулировка задачи:
Цитата:
В некоторых компьютерных языках, таких как Visual Basic, есть операции, с помощью которых можно выделить часть строки и присвоить ее другой строке. (В стандартном классе string предложены различные подходы.) Используя наследование, добавьте такую возможность в класс Pstring из упражнения 2. В новом производном классе Pstring2 разместите три новых функции: left(), mid(), right().

s2.left ( s1, n )
в строку s2 помещается n самых левых символов строки s1

s2.mid ( s1, s, n )
в строку s2 помещаются n символов из строки начиная с символов номер s

s2.right ( s1, n )
В строку s2 помещаются n самых правых символов строки s1

Вы можете использовать цикл for для копирования символ за символом подходящих частей строки s1 во временный объект класса Pstring2, который затем их возвратит. Для получения лучшего результата используйте в этих функциях возврат по ссылке, чтобы они могли быть использованы с левой строны знака "равно" для изменения части существующей строки.


Вот решение:

Код:
#include <iostream>
#include <string>
using namespace std;

class String                    //user-defined string type
   {
   protected:
      enum { SZ = 80 };         //size of all String objects
      char str[SZ];             //holds a C-string
   public:
      String()                  //no-arg constructor
         { str[0] = '\0'; }
      String( char s[] )        //1-arg constructor
         { strcpy(str, s); }    //   convert C-string to String
      void display() const      //display the String
         { cout << str; }
      operator char*()          //conversion operator
         { return str; }        //convert String to C-string
   };

// Если длина 's' больше 79, копируем только 80 символов
// Если меньше просто копируем s в str
class Pstring: public String
{
    public:
    Pstring():String()
    {}
    Pstring( char s[] )
    {
        if (strlen(s)>SZ-1)
        {
            for (int j=0; j<SZ-1; j++)
            {
            str[j]=s[j];
            str[j+1]='\0';
            }
        }
        else
        {
            strcpy(str, s);
        }
    }

    char* left(Pstring st, int n)
    {
        for (int i=0; i<=n; i++)
        {
            str = st.str;
            str[i+1]='\0';
        }
        return str;
    }

    char* mid(Pstring st, int s, int n)
    {
        int u=0;
        int start = s-1;        // 9-1=8
        int end = (n+start)-1;  // 18+8=26

        for (int i=start; i<=end; i++)
        {
            str = st.str;
            str[i+1]='\0';
            u++;
        }
        return str;
    }

    char* right(Pstring st, int n)
    {
        int u = 0;
        int len = strlen(st.str);       // 54 - кол-во символов (54='\0')
        int start = strlen(st.str)-n;   // 49 - первый копируемый символ 'U'ser
        int end = strlen(st.str)-1;     // 53 - последный '.'\0

        for (int i=start; i<=end; i++)  // start=48, end=53;
        {
            str = st.str;
            str[u+1]='\0';
            u++;
        }
        return str;
    }
};
////////////////////////////////////////////////////////////////
int main()
    {
   
    Pstring s1 = "It is a pleasure to welcome you as a new Premium User."; // кол-во символов 54 (0...53)
    Pstring s2,s3,s4;

    cout << s2.left(s1,7) << endl;
    cout << s3.mid(s1,9,18) << endl;
    cout << s4.right(s1,5) << endl;

    return 0;                      
   }

Все замечательно работает, только не получается вернуть по ссылке :)
Если я заменю:
 
Код:
char* left(Pstring st, int n)
    {
        for (int i=0; i<=n; i++)
        {
            str = st.str;
            str[i+1]='\0';
        }
        return str;
    }

На:
 
Код:
char& left(Pstring st, int n)
    {
        for (int i=0; i<=n; i++)
        {
            str = st.str;
            str[i+1]='\0';
        }
        return str;
    }

Компилятор выдаст ошибку:
Цитата:
error C2440: 'return' : cannot convert from 'char [80]' to 'char &'


Не могу понять почему " cannot convert from 'char [80]' to 'char &' "

P.S. Указатели я не изучал, звездочки поставил тупо методом перебора..
Хотелось бы сделать правильно..

87
28 апреля 2009 года
Kogrom
2.7K / / 02.02.2008
Лучше все-таки изучить указатели. Особо не вникал - поправил чтоб только заработало:

Код:
#include <iostream>
#include <string>
using namespace std;

class String                    //user-defined string type
   {
   protected:
      enum { SZ = 80 };         //size of all String objects
      char str[SZ];             //holds a C-string
   public:
      String()                  //no-arg constructor
         { str[0] = '\0'; }
      String( char s[] )        //1-arg constructor
         { strcpy(str, s); }    //   convert C-string to String
      void display() const      //display the String
         { cout << str; }
      operator char*()          //conversion operator
         { return str; }        //convert String to C-string
   };

// Если длина 's' больше 79, копируем только 80 символов
// Если меньше просто копируем s в str
class Pstring: public String
{
    public:
    Pstring():String()
    {}
    Pstring( char s[] )
    {
        if (strlen(s)>SZ-1)
        {
            for (int j=0; j<SZ-1; j++)
            {
            str[j]=s[j];
            str[j+1]='\0';
            }
        }
        else
        {
            strcpy(str, s);
        }
    }

    String& left(Pstring st, int n)
    {
        for (int i=0; i<=n; i++)
        {
            str = st.str;
            str[i+1]='\0';
        }
        return *this;
    }

    String& mid(Pstring st, int s, int n)
    {
        int u=0;
        int start = s-1;        // 9-1=8
        int end = (n+start)-1;  // 18+8=26

        for (int i=start; i<=end; i++)
        {
            str = st.str;
            str[i+1]='\0';
            u++;
        }
        return *this;
    }

    String& right(Pstring st, int n)
    {
        int u = 0;
        //int len = strlen(st.str);     // 54 - кол-во символов (54='\0')
        int start = strlen(st.str)-n;   // 49 - первый копируемый символ 'U'ser
        int end = strlen(st.str)-1;     // 53 - последный '.'\0

        for (int i=start; i<=end; i++)  // start=48, end=53;
        {
            str = st.str;
            str[u+1]='\0';
            u++;
        }
        return *this;
    }
};
////////////////////////////////////////////////////////////////
int main()
    {

    Pstring s1 = "It is a pleasure to welcome you as a new Premium User."; // кол-во символов 54 (0...53)
    Pstring s2,s3,s4;

    s2.left(s1,7).display();
    cout << endl;
    s3.mid(s1,9,18).display();
    cout << endl;
    s4.right(s1,5).display();
    cout << endl;

    return 0;
   }
29K
30 апреля 2009 года
EXAngel
29 / / 08.07.2008
Спасибо, буду разбираться с указателями.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог