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

наследование С++ - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Перевести задачу на C++ http://www.cyberforum.ru/cpp-beginners/thread383776.html
Помогите перевести данную программу на c++ вся трудность в том что не знаком с синтаксисом С++ http://s017.***********/i444/1111/26/171e3a9bb4b9.png
C++ Устная задачка) Помогите пожалуйста. Мне нужно построить область, удовлетворяющую неравенствам: x<=2, y<x, y>=1/x. И самое смешное в том, что я не могу просчитать это математически))) помогите пожалуйста!!! Как мне постоить этот график? Если не сложно, то сделайте простенький чертеж, например в паинте)) http://www.cyberforum.ru/cpp-beginners/thread383758.html
MS VISUAL C++ и Builder C++ C++
Всем привет, я программирую на delphi, решил начать изучать C++, я выучил самые основы на dev С++, тоесть писал консольные программы :) Теперь хочу перейти за кокой нить компилятор посерьезнее между MS VISUAL C++ и Builder C++ , если я начну программировать на Builder C++ т.к после delphi на нем будет легче чем на MS VISUAL C++ , При изучении Builder C++ потом мне лугко будет перейти на MS...
задача C++
В строке записано латинскими буквами нестрого фамили, имя и отчество через пробел (Имя может стоять и в начале и в конце и в середине). Требуется написать программу, определяющую положение начального символа слова 'Ivan' в строке символов (Номер позиции, с которой начинается слово Ivan).
C++ простая задачка http://www.cyberforum.ru/cpp-beginners/thread383723.html
Требуется написать программу, определяющую количество символов до точки. Точка в строке одна.
C++ WinAPI Положение консоли. Нужно, чтобы консоль открывалась каждый раз ближе к левому верхнему углу экрана. Как задать положение? Ещё вопрос-если вывести много информации, то колесо прокрутки исчезает, то есть можно увидеть только последнюю часть. Как это исправить? подробнее

Показать сообщение отдельно
Сыроежка
Заблокирован
14.11.2011, 19:04     наследование С++
Замечания по базовому классу.

Вместо

C++
1
CStr(char*);//Конструктор создания строки, равной заданной С- строке
лучше написать

C++
1
CStr( const char*);//Конструктор создания строки, равной заданной С- строке
Оператор-функцию

C++
1
bool operator ==(CStr &);
лучше сделать не членом класса. Так как у вас есть конструктор, принимающий символьную строку, то вы тогда сможете сравнивать объект вашего класса с произвольной символьной строкой. Поэтому эта функция должна выглядеть следующим образом

C++
1
bool operator ==( const CStr &, const CStr & );
и должна быть объявлена вне класса.

Смысл этой функции

C++
1
void empty();
совершенно не понятен. Скорей всего вы имели в виду, что эта функция должна возвращать логическое значение

C++
1
bool empty() const;
Функцию

C++
1
char * get_str()  const {return s;} //Метод  получения строки
лучше определить таким образом, чтобы результат нельзя было изменять, то есть

C++
1
const char * get_str()  const {return s;} //Метод  получения строки
Мне представляется, что конструктор

C++
1
2
CStr::CStr():len(0)
{s=new char;*s='\0'; cout<<"\nContructor1";}
можно определить проще, К тому же ваш конструктор содержит ошибку, так как вместо new char[1] вы используете new char, а в деструкторе у вас используется delete [] s, а не delete s

C++
1
2
3
4
CStr::CStr():len(0), s( new char[1] )
{
   *s='\0'; cout<<"\nContructor1";
}
Данный конструктор содержит ошибку

C++
1
2
3
4
CStr::CStr(char* a)
{s=new char[len=strlen(a)];
        strcpy(s,a);
        cout<<"\nContructor2";
нужно к strlen( a ) прибавить 1 для нулевого завершающего символа. К тому же параметр должен иметь квалификатор const

C++
1
2
3
4
5
CStr::CStr(const char* a) : len( strlen( a ) ), s( new char[len+1] )
{
        strcpy(s,a);
        cout<<"\nContructor2";
}
Только мой пример конструктора базируется на том, что в вашем классе сначала должна быть объявлена переменная len, а после нее переменная s, так как порядок инициализации переменных в списке инициализации конструктора зависит от порядка объявления членов класса.

Конструктор копирования с учетом мною сказанного выше будет выглядеть следующим образом

C++
1
2
3
4
5
6
// Конструктор копирования
CStr::CStr(const CStr& a) : len( a.len ), s( new char[len+1] )
{
   strcpy(s,a.s);
   cout<<"\nContructor3 ";
}
В операторе присваивания у вас ошибка

C++
1
2
3
4
5
6
7
8
9
CStr& CStr::operator = (const CStr & a)
{
        if (&a==this)  return *this;
        if (len) delete []s;
        s=new char [len=a];
        strcpy(s,a.s);
        cout<<" \nDONE == ";
        return *this;
}
Согласно вашему дизайну класса переменная len может быть равной 0, но при этом вы выделяли память под один нулевой символ.
Поэтому освобождение памяти должно быть безусловной! Вы всегда, когда создаете объект класса, выделяете память для s.


Как я уже написал, оператор сравнения лучше сделать не членом класса

C++
1
2
3
4
bool operator ==(const CStr & lhs, const CStr &rhs )
{
   return ( strcmp( lhs.get_str(), rhs.get_str() ) == 0 );
}
С функцией emplty() я ошибся, увидев ваше ее определение. Вы имеете вв виду не то, что я думал. Тогда можете пропустить мой комментарий относительно этой функции ранее.
 
Текущее время: 05:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru