ООП в C++ (Небольшие вопросы)

Модератор: Модераторы разделов

Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12

ООП в C++

Сообщение Assuri »

У меня есть небольшой простенький скриптик, но с пременением ООП:

Код:

# include <iostream> using namespace std; class rectangle { private: double length; double width; public: rectangle() { assign(0,0); }; rectangle(double Len,double Wide) { assign(Len,Wide); }; double Length() { return length; }; double Width() { return width; }; double Area() { return length*width; }; void assign(double Len,double Wide); }; void rectangle::assign(double Len,double Wide) { length=Len; width=Wide; } int main() { rectangle rect; double len,wid; cout<<"Введите длину прямоугольника : "; cin>>len; cout<<"Введите ширину прямоугольника: "; cin>>wide; rect.assign(len,wide); cout<<" Введеная длина ="<<rect.Length()<<"\n"; cout<<" Введеная ширина ="<<rect.Width()<<"\n"; cout<<" Площадь прямоугольника = "<<rect.Area()<<"\n"; return 0; }

Однако компилятор g++ выдает ошибки :

Код:

rect.cpp:14: error: declaration of ‘double rectangle::length()’ rect.cpp:10: error: conflicts with previous declaration ‘double rectangle::length’ rect.cpp:15: error: declaration of ‘double rectangle::width()’ rect.cpp:11: error: conflicts with previous declaration ‘double rectangle::width’ rect.cpp: In member function ‘double rectangle::length()’: rect.cpp:14: error: argument of type ‘double (rectangle::)()’ does not match ‘double’ rect.cpp: In member function ‘double rectangle::width()’: rect.cpp:15: error: argument of type ‘double (rectangle::)()’ does not match ‘double’ rect.cpp: In member function ‘double rectangle::area()’: rect.cpp:16: error: invalid use of member (did you forget the ‘&’ ?) rect.cpp:16: error: invalid use of member (did you forget the ‘&’ ?) rect.cpp: In member function ‘void rectangle::assign(double, double)’: rect.cpp:22: error: invalid use of member (did you forget the ‘&’ ?) rect.cpp:23: error: invalid use of member (did you forget the ‘&’ ?) rect.cpp: In function ‘int main()’: rect.cpp:31: error: ‘wide’ was not declared in this scope

Я уже что только не менял, но все равно не могу найти ошибки.

P.S. Программирую на C++ две недели. Ubuntu 6.10 .
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: ООП в C++

Сообщение KiWi »

Код: Выделить всё

   double length;
   double Length() { return length;       };


И чего он, дурак, ругается?
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12

Re: ООП в C++

Сообщение Assuri »

IFL писал(а):
06.05.2007 19:31

Код: Выделить всё

   double length;
   double Length() { return length;       };


И чего он, дурак, ругается?

А разве переменные считаются одинаковыми при разном регистре?

Удалил

Код: Выделить всё

private:
   double length;
   double width;

Но все равно тоже самое...
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: ООП в C++

Сообщение Uncle_Theodore »

IFL писал(а):
06.05.2007 19:31

Код: Выделить всё

   double length;
   double Length() { return length;       };


И чего он, дурак, ругается?

Хм-хм-хм...
У меня он ругается только на
double len,wid;
cout<<"Введите ширину прямоугольника: "; cin>>wide;
rect.assign(len,wide);

После исправления -- работает нормально...
Интересно... Чего я не вижу?
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12

Re: ООП в C++

Сообщение Assuri »

Uncle_Theodore писал(а):
06.05.2007 19:34
Хм-хм-хм...
У меня он ругается только на
double len,wid;
cout<<"Введите ширину прямоугольника: "; cin>>wide;
rect.assign(len,wide);

Хм.. А вот это уже странно. Может быть я не подключил какую-нибудь нужную библеотеку? или namespace неправильный?
точку-с-запятой в конце метода.

А по конкретней?
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: ООП в C++

Сообщение Uncle_Theodore »

-DooM- писал(а):
06.05.2007 19:37
Хм.. А вот это уже странно. Может быть я не подключил какую-нибудь нужную библеотеку? или namespace неправильный?

А глупый вопрос тебе, ты его как компилируешь,

g++ rectangle.cpp -o rectangle
или gcc ... ?

Хотя, да, вижу, g++

Я еще одну вещь сделал, но она не могла ни на что повлиять. Я русские строки на английские сменил.
Ну и скопировал твой текст в emacs...
Работает, зараза...
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12

Re: ООП в C++

Сообщение Assuri »

Всем спасибо. Все исправил. В принципе проблема была действительно только в том, что я переменную неправильно написал, но при изменял не rect.cpp, а rect.cpp~. Кстати, почему создаются какие то непонятные файлы с тильдой на конце?
Тему прошу не закрывать, так как вопросы еще будут.
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: ООП в C++

Сообщение Uncle_Theodore »

-DooM- писал(а):
06.05.2007 19:44
Всем спасибо. Все исправил. В принципе проблема была действительно только в том, что я переменную неправильно написал, но при изменял не rect.cpp, а rect.cpp~. Кстати, почему создаются какие то непонятные файлы с тильдой на конце?

Это резервные копии. А на случай если вырубят свет, а ты не успеешь записаться, emacs еще и буфер сохраняет, с решеточки начанается.
Тему прошу не закрывать, так как вопросы еще будут.

Ладно, не будем. Но в принципе, правила требуют одной темы для одного вопроса. :)
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: ООП в C++

Сообщение KiWi »

Uncle_Theodore писал(а):
06.05.2007 19:34
Интересно... Чего я не вижу?

rect.cpp:14: error: declaration of ‘double rectangle::length()
rect.cpp:10: error: conflicts with previous declaration ‘double rectangle::length’


Ругается на это? Ругается.
Из возможных previous declaration -- double length.

Хотя да, регистр каким-то образом стал нижним.
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12

Re: ООП в C++

Сообщение Assuri »

В принципе, в моей книги по проге на C++ написано, что такое конструктор, но я не понимаю зачем он нужен. Может быть кто-нибудь объяснит?
Спасибо сказали:
BaBL
Сообщения: 767
ОС: Debian GNU/Linux SID

Re: ООП в C++

Сообщение BaBL »

-DooM- писал(а):
07.05.2007 11:00
В принципе, в моей книги по проге на C++ написано, что такое конструктор, но я не понимаю зачем он нужен. Может быть кто-нибудь объяснит?

конструктор - это метод, имеющий то же имя что и сам класс. Он вызывается при создании нового элемента класса и позволяет задать ему какие-то параметры, которые будут отличать этот элемент от ему подобных. Собственно то, зачем этот элемент и создается.

не знаю как объяснить, если честно. Если поймешь что выше написал - ОК, не поймешь, сорри =)

к примеру ты создаешь элемент, скажем, newElement = new ClassName(arg) - вот этот arg попадает в конструктор и тот, в свою очередь, выполняет нужные тебе действия и создает элемент с указанным тобой параметром. Если создаешь класс наследник, то конструктор для него надо бы переопределить.
Спасибо сказали:
Wegman
Сообщения: 89

Re: ООП в C++

Сообщение Wegman »

-DooM- писал(а):
07.05.2007 11:00
В принципе, в моей книги по проге на C++ написано, что такое конструктор, но я не понимаю зачем он нужен. Может быть кто-нибудь объяснит?

Зачем нужен? - для инициализации экземпляра класа. Заполнить поля, память выделить и.т.д.

Представь, что у теб есть класс "Работник" и дочерний класс "Программист". В классе "Работник" есть поле "должность". Было бы логично при создании экземпляра класса "Программист" заполнять поле "должность" соответствующим значением. Это удобно сделать в конструкторе т.к. конструктор автоматически вызывается при создании экземпляра класса.
Registered Linux user number 414635 Зарегистрироваться
Спасибо сказали:
BaBL
Сообщения: 767
ОС: Debian GNU/Linux SID

Re: ООП в C++

Сообщение BaBL »

Wegman писал(а):
07.05.2007 13:05
Зачем нужен? - для инициализации экземпляра класа. Заполнить поля, память выделить и.т.д.

Представь, что у теб есть класс "Работник" и дочерний класс "Программист". В классе "Работник" есть поле "должность". Было бы логично при создании экземпляра класса "Программист" заполнять поле "должность" соответствующим значением. Это удобно сделать в конструкторе т.к. конструктор автоматически вызывается при создании экземпляра класса.

Во, на примерах это лучше выглядит.
Спасибо сказали:
elf74
Сообщения: 482
Статус: Линуксоид-Самовар :)
ОС: Mandriva Power Pack 2008.0 LCE

Re: ООП в C++

Сообщение elf74 »

-DooM- писал(а):
07.05.2007 11:00
В принципе, в моей книги по проге на C++ написано, что такое конструктор, но я не понимаю зачем он нужен. Может быть кто-нибудь объяснит?

А какую книгу ты читаешь?
Может не такую какую-нибудь?
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12

Re: ООП в C++

Сообщение Assuri »

Появилась новая проблемка, от которой я постепенно схожу с ума.

Вот он скрипт, который непонятно почему работает не так, как надо:

Код:

#include <iostream> using namespace std; class game { private: string lan; public: game(string Lan) { chlan(Lan); } void chlan(string Lan) { if (Lan=="ru") lan="en"; else lan="ru"; } void present() { cout<<lan<<"\n"; if (lan=="en") { cout<<" Hello. This game is called \"Divine number\""; cout<<"\n If you want change a language of this program write \"chlan\". ;) \n "; } else { cout<<" Здраствуйте. Эта программа называется \"Угадай число\""; cout<<"\n Если вы хотите поменять язык напишите \"chlan\". Приятной игры ;) \n "; } } }; int main(void) { string lan; lan="ru"; game g(lan); for (int i=1;i<=2;i++) { cout<<lan; g.chlan(lan); cout<<lan; g.present(); } }


Результат:
ruruen
Hello. This game is called "Divine number"
If you want change a language of this program write "chlan". ;)
ruruen
Hello. This game is called "Divine number"
If you want change a language of this program write "chlan". ;)


Вот что я не понимаю:
1. Почему после g.chlan(lan); язык не меняется?
2. Из-за чего после g.present(); он меняется?
Спасибо сказали:
BaBL
Сообщения: 767
ОС: Debian GNU/Linux SID

Re: ООП в C++

Сообщение BaBL »

-DooM-,
-DooM- писал(а):
08.05.2007 16:03
game(string Lan) { chlan(Lan); }
void chlan(string Lan)
{
if (Lan=="ru") lan="en"; else lan="ru";
}


регистр переменной значения не имеет?
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12

Re: ООП в C++

Сообщение Assuri »

BaBL писал(а):
08.05.2007 16:11
-DooM-,

регистр переменной значения не имеет?

Ну вообще-то так задумано. То есть передается в фукции, как Lan, и в зависимости от его значение меняется lan, который и определяет язык.
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: ООП в C++

Сообщение Uncle_Theodore »

Внимательно прочти, что делает main().

переменной lan присваивается "ru"
создается объект g класса game, в котором поле lan устанавливается на "en"
Теперь в переменной lan у нас "ru", а в переменной g.lan у нас "en"

два раза (зачем-то) делается
вызывается g.chlan(lan);
переменная g.lan остается "en", потому что вызвана эта функция на переменной lan из функции main(), а значение переменной lan есть "ru"
выводится значение переменной lan
представляся g, в соответствии с правилом, по которому раз g.lan у нас "en", то представляемся по-английски... :)

Все правильно.

В классе не надо вызывать функцию chlan на аргументе. Класс и так имеет доступ к своим полям.

И про сяшный код не говрят "скрипт". Скрипт -- это на Баше. :) Про С говоря "код"...
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12

Re: ООП в C++

Сообщение Assuri »

Огромное спасибо. Все проанализировал по шагам и нашел что я делал не так.
про сяшный код не говрят "скрипт". Скрипт -- это на Баше. Про С говоря "код"...

PHP дает о себе знать :)
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12

Re: ООП в C++

Сообщение Assuri »

Объясните пожалуйста код:

Код: Выделить всё

class Array
{
protected:
   unsigned sz;
public:
  Array(const Array& a); // Что это за странный параметр у конструктора?
};
Array::Array (const Array& a)
{
  sz=a.sz; // Что за "a".  И откуда оно взялось?
}
Спасибо сказали:
Аватара пользователя
sarutobi
Сообщения: 676
Статус: Добрость и скромнота
ОС: Debian 5, FreeBSD 6.2/8.0

Re: ООП в C++

Сообщение sarutobi »

ЭЭЭЭЭ...... начнем с чтения какого нибудь толкового мануала по C++, благо их в прикрепленных темах много указано.
вопрос задан про копирующий конструктор. Предположим, есть некий объект, и мы хотим получить идентичную ему копию. С переменными-примитивами все понятно

Код: Выделить всё

int b; b=5;
int a; a = b;

А вот с объектом такой фокус не прокатит, ибо скопируются только адреса указателей на объект, а сам объект как был так и останется в единственном экземпляре.
Теперь о ппараметрах конструктора копирования - const значит что мы не будем менять параметр a в данной функции, амперсанд говорит что нам нужен объект, на который указывает a (операция ссылки), а не его адрес. Ну и откуда взялось a - можно посмоттреть на список параметров конструктора......
Fire and water, earth and sky - mistery surrounds us, legends never die!
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12

Re: ООП в C++

Сообщение Assuri »

Меня больше всего интересует участок кода: sz=a.sz; Что значит a.sz. Из того конструктора, где есть константа "a" берется значение sz?
Спасибо сказали:
Аватара пользователя
landrew.xp
Сообщения: 396
Статус: Опытный новичок в оффлайне
ОС: OpenSUSE; Mandriva; Ubuntu

Re: ООП в C++

Сообщение landrew.xp »

-DooM- писал(а):
14.05.2007 18:38
Меня больше всего интересует участок кода: sz=a.sz; Что значит a.sz. Из того конструктора, где есть константа "a" берется значение sz?

Ты в этом конструкторе передаешь уже созданный объект класса Array. Значение его полей и используешь для инициализации вновь созданного.
Читать, читать и еще раз читать.
Есть многое на свете, друг Горацио,
Что и не снилось нашим мудрецам.
Спасибо сказали:
Аватара пользователя
eduard_pustobaev
Сообщения: 2629
Статус: Ленивец
ОС: Arch/Debian.

Re: ООП в C++

Сообщение eduard_pustobaev »

-DooM- писал(а):
14.05.2007 18:38
Меня больше всего интересует участок кода: sz=a.sz; Что значит a.sz. Из того конструктора, где есть константа "a" берется значение sz?

Ты самостоятельно программирование с нуля выучить решил что ли? Неблагодарное это дело. Как минимум нужно какую-нибудь книжку прочитать.
В дисгармонии со вселенной.
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: ООП в C++

Сообщение v04bvs »

Код: Выделить всё

class Array // Объявляем класс Array
{
protected:  // Область видимости protected : всё что здесь объявлено, доступно методам класса и методам потомков этого класса
   unsigned sz; // поле sz типа unsigned
public:     // Областьвидимости public : всё что здесь объявлено, доступно всем
  Array(const Array& a); // Копирующий конструктор. Он принимает переменную типа const Array& под именем a
};

// Реализация копирующего конструктора
Array::Array (const Array& a)
{
  sz=a.sz; // полю sz текущего объекта присваивается значение поля sz объекта, передаваемого как параметр функции
}


Конструктор копирования используется, когда надо создать новый объект, как копию текущего. Например

Код: Выделить всё

Array a;
a.sz = 4;
Array b(a); // Переменная b создаётся с помощью описанного конструктора копирования


Более сложный пример:

Код: Выделить всё

void f(Array a)
{
}

Array arr; f(arr);


в данном случае параметр у функции передаётся по значению (а не по ссылке), поэтому конструируется временный объект с помощью конструктора копирования, вызывается функция с параметром, указывающем на этот объект, а после завершения работы функции временный объект удаляется.
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: ООП в C++

Сообщение deninok »

Советую автору темы прочитать хорошую книгу по С++. Рекомендую "Философию С++" Брюса Эккеля. Если автор задает вопрос о том, что такое конструктор, то ему действительно надо разобраться. Очень рекомендую вышеуказанную книгу.
Спасибо сказали:
Olegator
Сообщения: 2493
ОС: SuseLinux 11.2 KDE 4.3

Re: ООП в C++

Сообщение Olegator »

deninok писал(а):
15.05.2007 10:55
Советую автору темы прочитать хорошую книгу по С++. Рекомендую "Философию С++" Брюса Эккеля. Если автор задает вопрос о том, что такое конструктор, то ему действительно надо разобраться. Очень рекомендую вышеуказанную книгу.

эту книжку я не читал, но читал Р.Лафоре "Объектно-ориентированное программирование в c++" очень хорошая книга, особенно для новичков. вот ссылка на torrent, там куча книжек по с++ и Лафоре там тоже есть
Спасибо сказали:
Аватара пользователя
georgy_sh
Сообщения: 1172
Статус: thermonuclear...
ОС: GNU/Linux

Re: ООП в C++

Сообщение georgy_sh »

Olegator писал(а):
19.05.2007 03:55
эту книжку я не читал, но читал Р.Лафоре "Объектно-ориентированное программирование в c++" очень хорошая книга, особенно для новичков. вот ссылка на torrent, там куча книжек по с++ и Лафоре там тоже есть

О_о

/offtop
Я поддерживаю уважаемого Olegator и присоединяюсь к его совету.

ЗЫ По ходу дела в книге правьте ошибки(читай, опечатки), коих там достаточно =)
Спасибо сказали:
Olegator
Сообщения: 2493
ОС: SuseLinux 11.2 KDE 4.3

Re: ООП в C++

Сообщение Olegator »

He1mut писал(а):
19.05.2007 13:19
О_о

/offtop
Я поддерживаю уважаемого Olegator и присоединяюсь к его совету.

ЗЫ По ходу дела в книге правьте ошибки(читай, опечатки), коих там достаточно =)


Да ошибки там есть, но они не такие страшные сам догоняешь, наоборот они помогают включить соображалку :). Ещё её очень интересно читать, там есть даже анекдоты и всякие интересные факты, которые помогут немного расслабиться. И самое главное в конце каждой главы есть тесты и задачи для самостоятельной работы
Спасибо сказали: