Semenalidery.com

IT Новости из мира ПК
5 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Class point c

Класс Point и Line в С++?

8 [2009-02-19 14:31:00]

Я изучаю С++ (и вообще программирование), и я пытаюсь сделать как класс Point, так и класс Line.

Строка должна состоять из двух точечных объектов.

Могут ли гуру С++ просмотреть мою работу и сказать мне, правильно ли это использовать указатели, ссылки и классы?

11 ответов

7 [2009-02-19 14:36:00]

Вы не должны использовать указатели вообще в своем коде. Используйте фактические объекты. Указатели на самом деле используются на С++ довольно редко.

Независимо от того, являются ли члены Point вашего класса линии указателями или нет, создается совсем другой тип класса. Использование указателей приведет к классическому подходу стиля CoGo, который можно рассматривать как точки, похожие на гвозди в доске, а линии — резиновые ленты, соединяющие эти гвозди. Изменение точки похоже на перемещение гвоздя, автоматически все связанные с ней линии работают, что желательно в определенных приложениях.

Использование литеральных точек означает, что линии все независимы друг от друга, что подходит для других типов приложений.

Это критическое дизайнерское решение для ваших классов на этом этапе.

Изменить: Как отмечено в других сообщениях и комментариях ниже, использование простых указателей для достижения взаимосвязи между несколькими линиями и точками также представляет серьезную потенциальную проблему. В частности, если точка удалена или перемещена в памяти, все указатели, ссылающиеся на эту точку, должны быть обновлены. На практике это, как правило, преодолевается с помощью уникальных идентификаторов точек для поиска точки, а не простых указателей. Это также позволяет легко структурировать/сохранять структуры CoGo. Таким образом, наш точечный класс будет иметь статический член, чтобы получить точку, основанную на ID, и наш класс линии будет иметь два точечных идентификатора, а не указатели.

5 ChrisW [2009-02-19 14:43:00]

+1 что сказал zabzonk.

Время использования указателей, как вы их использовали, будет:

  • У вас есть несколько точек.
  • Вы хотите создать строки, используя эти точки.
  • Вы хотите изменить значения точек и неявно менять строки.

Шаг 3 выше может быть достигнут, если строки содержат указатели на существующие точки. Он вводит сложность (например, «когда вы уничтожаете экземпляр Point, что происходит с экземплярами Line, которые содержат указатели на Point?» ), Который не существует, когда (как предполагал zabzonk) каждая строка содержит свои собственные значения Point.

2 strager [2009-02-19 14:38:00]

Нет необходимости использовать указатели в вашем классе Line.

Кроме того, следующая строка неверна:

Почему? Вы назначаете Point & (p1) a Point * (Line:: p1), что является незаконным. Вам нужны указатели.

Класс Point не имеет возможности изменять свои данные. Не слишком полезно.

Класс Line для меня будет выглядеть примерно так:

Теперь вы можете редактировать свою строку следующим образом:

Я бы предпочел это.

1 sykora [2009-02-19 14:38:00]

Несколько вещей, которые я заметил:

  • Вы можете объединить оба ваших конструктора точек в один конструктор со значениями по умолчанию.
  • Ваше использование указателей совершенно не нужно. Используйте сам объект.
  • Вы используете оба указателя и ссылки взаимозаменяемо. Не смешивайте их и не смотрите в последнюю точку.

Я вижу мало смысла в создании указателей Point (кроме значения иронии). Ваша точка занимает 8 байтов в 32-битной системе (2 int’s). Указатель занимает 4 байта. вы сохраняете 4 байта.

Что касается правильности, конструктор Line принимает ссылки, но вы назначаете их указателям. Это даже не нужно компилировать. Вы также делаете то же самое в setPoints. Было бы лучше просто сделать две точки фактическими объектами и скопировать их значения.

0 alok [2009-02-19 14:41:00]

Функция setPoints() не будет работать — на первый взгляд. Это должно быть

Опять же, мы не контролируем, когда p1 и p2 уничтожаются. Лучше создать this- > p1 и this- > p2, используя данные в p1 и p2, чтобы деструктор имел контроль над памятью

0 xtofl [2009-02-19 15:19:00]

Прежде чем расспрашивать о гуру языка, начните думать о дизайне, в данном случае, особенно о жизни ваших объектов: нужно ли существовать точка без линии? Делают ли линии общие баллы? Кто создает точку, когда она перестает существовать? Являются ли две точки с одинаковыми координатами одинаковыми или равными (один может быть красный, другой может быть синий).

Похоже, что большинство из нас согласны с тем, что вы должны использовать семантику значений на такой небольшой базе кода. Иногда проблема требует, чтобы один и тот же объект (т.е. Точка) ссылался на многие стороны, а затем использовал указатели (или ссылки).

Выбор между указателем и ссылкой — это еще что-то еще. Я предпочитаю использовать ссылку при реализации агрегации (строка не может существовать без ее конечных точек) и указатель при реализации менее «близкого» отношения.

Компилятор даст ошибки в этом коде:

Я думаю, что завершает синтаксис.

Есть еще одна проблема с кодом:

Члены класса p1 и p2 линии являются указателями на экземпляры Point. Кто создает эти экземпляры и кто удалит их, когда они больше не понадобятся? Если вы создаете свой класс так, как сейчас, код, создающий экземпляр Line, передает два экземпляра Point в конструктор. Если эти экземпляры Point удалены до строки, линия остается с двумя оборванными указателями (указатели, которые больше не ссылаются на действительный экземпляр).

Кроме того, два экземпляра Point, которые теперь являются частью Линии, могут быть изменены из кода вне класса Line. Это может привести к очень нежелательным ситуациям.

В этой ситуации я объявлял бы члены p1 и p2 как Point (вместо указателя на Point). Таким образом, экземпляры Point, которые передаются конструктору, копируются в члены класса. Пока существует Линия, члены точки будут существовать. Они могут быть изменены только классом линии.

0 lilburne [2009-02-19 16:58:00]

Используйте объекты Point в классе Line. Владение этими пунктами неясно, и вы рискуете оказаться с оборванными указателями или пропущенной памятью.

Ваш конструктор по умолчанию является проблемой, так как вы редко хотите создать точку в точке (0,0). Вам лучше настроить значения x, y по умолчанию на что-то вроде MAXINT и утверждать, что любое использование Point не имеет MAXINT в качестве одного из его значений. Имейте функцию is_valid(), чтобы клиенты могли протестировать. Ваш класс Line также может иметь предварительное условие, что его две точки не являются недопустимыми. Оплатить за то, чтобы не дать действительной точке иметь значение MAXINT, является то, что вы можете обнаружить, что очки не были инициализированы должным образом, и вы можете обнаружить некоторые трудности с поиском ошибок в использовании класса.

Классы и объекты

В данном уроке мы рассмотрим классы в C++ и познакомимся с объектно-ориентированным программированием. Объектно-ориентированное программирование или ООП — это одна из парадигм программирования. Парадигма — это, другими словами, стиль. Парадигма определяет какие средства используются при написании программы. В ООП используются классы и объекты. Все наши предыдущие программы имели элементы разных парадигм: императивной, процедурной, структурной.

Мы можем написать одинаковую программу в разных парадигмах. Парадигмы не имеют чёткого определения и часто пересекаются.

Давайте посмотрим на пример. Допустим, в нашей игре есть танки и они могут стрелять, при стрельбе у них уменьшается боезапас. Как мы можем это смоделировать без ООП:

У нас есть структура, которая содержит поле, представляющее количество снарядов, и есть функция атаки, в которую мы передаём танк. Внутри функции мы меняем количество снарядов. Так может выглядеть игра на языке C: структуры отдельно от функций, которые совершают действия со структурными переменными. Данную ситуацию можно смоделировать по-другому с помощью объектно-ориентированного программирования (Object-Oriented Programming, OOP) — ООП.В ООП действия привязываются к объектам.

Определение классов в C++

Класс — это пользовательский тип данных (также как и структуры). Т.е. тип данных, который вы создаёте сами. Для этого вы пишете определение класса. Определение класса состоит из заголовка и тела. В заголовке ставится ключевое слов class, затем имя класса (стандартный идентификатор C++). Тело помещается в фигурные скобки. В C++ классы и структуры почти идентичны. В языке C в структурах можно хранить только данные, но в C++ в них можно добавить действия.

Читать еще:  Sharepoint 2020 установка и настройка

В C++ ключевые слова struct и class очень близки и могут использоваться взаимозаменяемо. У них есть только одно отличие (об этом ниже). Вот как можно определить такой же класс с помощью struct:

Отличие только первом ключевом слове. В одном из прошлых уроков мы уже обсуждали структуры. что мы видим новое? Ключевые слова private и public — это спецификаторы доступа. Также мы видим, что внутри класса мы можем вставлять определения функций.

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

Переменные и методы класса

Класс состоит из членов класса (class members). Члены класса могут быть переменными (data members) или методами (function members или methods). Переменные класса могут иметь любой тип данных (включая другие структуры и классы). Методы — это действия, которые может выполнять класс. По сути, это обычные функции.

Все методы класса имеют доступ к переменным класса. Обратите внимание, как мы обращаемся к ammo в методе Attack.

Создание объектов класса

Теперь у нас есть свой тип данных и мы можем создавать переменные данного типа. Если после определения структур мы могли создавать структурные переменные, то в случае классов, мы создаём объекты классов (или экземпляры). Разница между классами и структурами только в терминах. Для C++ это почти одно и то же.

Вот так мы можем создать объекты класса Tank и вызвать метод Attack:

t1 и t2 — объекты класса Tank. Для C++ объект класса — это всего-лишь переменная. Тип данных этих переменных — Tank. Ещё раз повторю, что классы (и структуры) позволяют создавать пользовательские типы данных.

В англоязычной литературе создание объектов классов также называется созданием экземпляров — instantiating.

Мы обращаемся к переменным класса и методам с помощью оператора точки (прямой доступ), также как мы обращались к полям структурных переменных.

В нашем примере каждый объект имеет доступ к своей копии ammo. ammo — переменная класса (data member). Attack — метод класса. У каждого объекта своя копия переменных класса, но все объекты одного класса вызывают одни и те же методы.

Размер объекта включает все данные, но не методы

В памяти переменные класса располагаются последовательно. Благодаря этому мы можем создавать массивы объектов и копировать их все вместе (если в классе этих объектов нет динамического выделения памяти). Это будет важно для нас, когда мы начнём работать с графикой в DirectX/OpenGL. Размер объекта класса можно узнать с помощью функции sizeof. При этом в качестве аргумента можно использовать как объект, так и сам класс:

Методы — это все лишь функции. Но в отличии от простых функций, у всех методов есть один скрытый параметр — указатель на объект, который вызывает данный метод. Именно благодаря этому указателю метод знает, какой объект вызвал его и какому объекту принадлежат переменные класса. Внутри метода имя этого указателя — this.

Указатель this

Вот как для компилятора выглядит любой метод:

Это просто иллюстрация. В реальности не нужно указывать аргумент (всё что в круглых скобках). Мы автоматически получаем доступ к указателю this. В данном случае его использование перед ammo необязательно, компилятор автоматически привяжет эту переменную к this.

Указатель this нужен, когда методу необходимо вернуть указатель на текущий объект.

Указатели на объекты

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

При использовании ссылки на объект, для доступа к его членам используется оператор прямого доступа (точка), т.е. с ссылкой можно обращаться как с обычным объектом:

Чуть ниже мы увидим один случай, когда не обойтись без ссылок.

Конструктор класса (Constructor)

Конструктор класса — метод, вызываемый автоматически при создании объекта. Он используется для инициализации переменных класса и выделении памяти, если это нужно. По сути это обычный метод. Имя обязательно должно совпадать с именем класса и он не имеет возвращаемого значения. Рассмотрим новый класс:

Здесь, в конструкторе задаются начальные значения переменных, но мы можем делать в нём всё что угодно, это обычная функция.

Перегрузка конструктора класса

Перегрузка (overloading) конструктора позволяет создать несколько конструкторов для одного класса с разными параметрами. Всё то же самое, что и при перегрузке функций:

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

В списке инициализации можно задать значение только части переменных класса.

Копирующий конструктор (Copy Constructor)

Без каких-либо действий с нашей стороны мы можем присваивать объектам другие объекты:

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

В копирующем конструкторе всегда используются ссылки. Это обязательно. Параметр point — это объект, стоящий справа от оператора присваивания.

Деструктор класса

Деструктор класса — метод, вызываемый автоматически при уничтожении объекта. Это происходит, например, когда область видимости объекта заканчивается. Деструктор нужно писать явно, если в классе происходит выделение памяти. Соответственно, в деструкторе вам необходимо освободить все указатели.

Допустим в нашем танке есть экипаж, пусть это будет один объект типа Unit. При создании танка мы выделяем память под экипаж. В деструкторе нам нужно будет освободить память:

Имя деструктора совпадает с именем класса и перед ним ставится тильда

. Деструктор может быть только один.

Объектно-ориентированное программирование в C++ (ООП)

Теперь, когда мы представляем что такое классы и объекты, и умеем с ними работать, можно поговорить о объектно-ориентированном программировании. Сам по себе стиль ООП предполагает использование классов и объектов. Но помимо этого, у ООП есть ещё три характерные черты: инкапсуляция данных, наследование и полиморфизм.

Инкапсуляция данных — Encapsulation

Что означает слово Encapsulation? Корень — капсула. En — предлог в. Инкапсуляция — это буквально помещение в капсулу. Что помещается в капсулу? Данные и действия над ними: переменные и функции. Инкапсуляция — связывание данных и функций. Давайте ещё раз взглянем на класс Tank:

Собственно, здесь в класс Tank мы поместили переменную ammo и метод Attack. В методе Attack мы изменяем ammo. Это и есть инкапсуляция: члены класса (данные и методы) в одном месте.

В C++ есть ещё одно понятие, которое связано с инкапсуляцией — сокрытие данных. Сокрытие предполагает помещение данных (переменных класса) в область, в которой они не будут видимы в других частях программы. Для сокрытия используются спецификаторы доступа (access specifiers). Ключевые слова public и private и есть спецификаторы доступа. public говорит, что весь следующий блок будет видим за пределами определения класса. private говорит, что только методы класса имеют доступ к данным блока. Пример:

Читать еще:  Числовой тип данных в access

Здесь мы видим, что объект может получить доступ только к членам класса, находящимся в блоке public. При попытке обратиться к членам класса (и переменным, и методам) блока private, компилятор выдаст ошибку. При этом внутри любого метода класса мы можем обращаться к членам блока private. В методе Move мы изменяем скрытые переменные x и y.

Хороший стиль программирования в ООП предполагает сокрытие всех данных. Как тогда задавать значения скрытых данных и получать доступ к ним? Для этого используются методы setters и getters.

Setters and Getters

Setters и Getters сложно красиво перевести на русский. В своих уроках я буду использовать английские обозначения для них. Setter (set — установить) — это метод, который устанавливает значение переменной класса. Getter (get — получить) — метод, который возвращает значение переменной:

Имена не обязательно должны включать Set и Get. Использование setters и getters приводит к увеличению количества кода. Можно ли обойтись без инкапсуляции и объявить все данные в блоке public? Да, можно. Но данная экономия кода имеет свои негативные последствия. Мы будем подробно обсуждать данный вопрос, когда будем говорить об интерфейсах.

Следующая концепция ООП — наследование.

Наследование (Inheritance) в C++

Производный класс не может получить доступ к private членам. Поэтому в классе Unit используется спецификатор protected. Данный спецификатор разрешает доступ к данным внутри класса и внутри дочерних классов, private же разрешает доступ только в методах самого класса.

При наследовании производный класс имеет доступ ко всем членам (public и protected) базового класса. Именно поэтому мы можем вызвать метод Move для объекта типа Archer.

Обратите внимание, как происходит наследование. При определении дочернего класса, после имени ставится двоеточие, слово public и имя базового класса. В следущем уроке мы рассмотрим для чего здесь нужно слово public.

Полиморфизм (Polymorphism)

Наследование открывает доступ к полиморфизму. Poly — много, morph — форма. Это очень мощная техника, которую мы будем использовать постоянно.

Полиморфизм позволяет поместить в массив разные типы данных:

Мы создали массив указателей на Unit. Но C++ позволяет поместить в такой указатель и указатель на любой дочерний классс. Данная техника будет особенно полезна, когда мы изучим виртуальные функции.

Заключение

Классы позволяют легко моделировать лубую предметную область. Иногда лучше избежать использование ООП, но об этом мы поговорим в другой раз.

В следующем уроке мы познакомимся с более сложными концепциями, касающимися классов: виртуалье методы, шаблоны, статичные члены. Впоследствии мы увидим, как классы используютя в DirectX.

Единственное отличие между классом и структурой в C++: по умолчанию в структуре используется спецификатор доступа public, а в классе — private. Часто в коде вы будете видеть, что структуры используются без методов, чисто для описания каких-либо сущностей. Но это делать необязательно это всего лишь соглашение.

C# — Classes

When you define a class, you define a blueprint for a data type. This does not actually define any data, but it does define what the class name means. That is, what an object of the class consists of and what operations can be performed on that object. Objects are instances of a class. The methods and variables that constitute a class are called members of the class.

Defining a Class

A class definition starts with the keyword class followed by the class name; and the class body enclosed by a pair of curly braces. Following is the general form of a class definition −

Access specifiers specify the access rules for the members as well as the class itself. If not mentioned, then the default access specifier for a class type is internal. Default access for the members is private.

Data type specifies the type of variable, and return type specifies the data type of the data the method returns, if any.

To access the class members, you use the dot (.) operator.

The dot operator links the name of an object with the name of a member.

The following example illustrates the concepts discussed so far −

When the above code is compiled and executed, it produces the following result −

Member Functions and Encapsulation

A member function of a class is a function that has its definition or its prototype within the class definition similar to any other variable. It operates on any object of the class of which it is a member, and has access to all the members of a class for that object.

Member variables are the attributes of an object (from design perspective) and they are kept private to implement encapsulation. These variables can only be accessed using the public member functions.

Let us put above concepts to set and get the value of different class members in a class −

When the above code is compiled and executed, it produces the following result −

C# Constructors

A class constructor is a special member function of a class that is executed whenever we create new objects of that class.

A constructor has exactly the same name as that of class and it does not have any return type. Following example explains the concept of constructor −

When the above code is compiled and executed, it produces the following result −

A default constructor does not have any parameter but if you need, a constructor can have parameters. Such constructors are called parameterized constructors. This technique helps you to assign initial value to an object at the time of its creation as shown in the following example −

When the above code is compiled and executed, it produces the following result −

C# Destructors

A destructor is a special member function of a class that is executed whenever an object of its class goes out of scope. A destructor has exactly the same name as that of the class with a prefixed tilde (

) and it can neither return a value nor can it take any parameters.

Destructor can be very useful for releasing memory resources before exiting the program. Destructors cannot be inherited or overloaded.

Following example explains the concept of destructor −

When the above code is compiled and executed, it produces the following result −

Static Members of a C# Class

We can define class members as static using the static keyword. When we declare a member of a class as static, it means no matter how many objects of the class are created, there is only one copy of the static member.

The keyword static implies that only one instance of the member exists for a class. Static variables are used for defining constants because their values can be retrieved by invoking the class without creating an instance of it. Static variables can be initialized outside the member function or class definition. You can also initialize static variables inside the class definition.

The following example demonstrates the use of static variables

When the above code is compiled and executed, it produces the following result −

You can also declare a member function as static. Such functions can access only static variables. The static functions exist even before the object is created. The following example demonstrates the use of static functions

Читать еще:  Условный доступ viaccess

When the above code is compiled and executed, it produces the following result −

class — Как перегрузить оператор для целочисленного, плавающего и двойного типов данных одновременно в переполнении стека

Я создаю 2D класс координат (названный «Точка»), чтобы помочь мне выучить C ++. Я хочу иметь возможность выполнять основные арифметические операции (+, -, *, / …) над объектами класса Point (например, Point_a + Point_b). Однако я также хочу иметь возможность выполнять такие операции между точками и другими типами переменных (int / float / double).

Это можно сделать с помощью перегрузки оператора / функции. Из приведенного ниже кода (только для добавления) видно, что я должен, насколько мне известно, включать две дополнительные функции для каждого дополнительного типа переменной, одну для формы «Point + int / float / double» и одну для Форма «int / float / double + Point».

Кажется, есть много повторений, особенно между функциями типа «Point + int / float / double». Мне было интересно, есть ли способ, чтобы это можно было немного замять. Скажем, вместо того, чтобы иметь отдельные версии для целых чисел, чисел с плавающей точкой и двойных, я мог бы иметь одну версию, которая будет обрабатывать все три. Например, преобразование кодовых блоков «A» и «B» во что-то вроде:

Вышеупомянутая секция кода предназначена для представления желаемого результата, а не фактически функциональной (например, int ИЛИ float ИЛИ double).

Короче, есть ли способ, которым я могу сделать « friend Point operator+(const Point &p1, int val); «и соответствующая ему функция (в блоке кода B) принимает целочисленные, плавающие и двойные значения, или мне нужно иметь индивидуальное значение для каждого типа переменной?

Спасибо за ваше время.

Решение

Отдельное решение, чем шаблонное, состоит в том, чтобы определить конструкторы для типов, которые вы хотите поддерживать, и иметь один оператор +, который работает с типами Point.

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

Это упрощает реализацию за счет потерянных временных объектов.

Существует стилистический аргумент о явном включении в список поддерживаемых типов через конструкторы и внесении в черный список через static_asserts.

Другие решения

Это можно сделать более обобщенно, используя шаблоны и специализируя исключительный случай, вместо предоставления перегруженной версии для каждого соответствующего типа:

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

Таким образом, вам нужно только предоставить операторов с точки зрения Point а также double ,

Вы можете сделать это с помощью шаблонов:

Это использует std::enable_if а также std::is_arithmetic , чтобы эта функция принимала только типы, которые являются «арифметическими типами», в основном целые числа и числа с плавающей точкой.

Точки operator+ Реализации все преобразует свои аргументы не Point в удваивается, прежде чем делать + на элементах.

float а также int перегрузки почти бессмысленны. Просто напишите два double Перегрузки.

Встроенная конвертация из int а также float будет происходить в operator+ вызов.

Если вам действительно нужны перегрузки int / float, и вы знаете, почему и проверили, что двойная перегрузка не работает, рассмотрите возможность исправления оператора преобразования сломанного шаблона, что является единственным способом, которым я могу убедиться в этом.

В противном случае приведите к удвоению явно.

В противном случае, возможно написать шаблон + это занимает любое T конвертируемый в double , затем преобразует и вызывает выше + за double , Затем добавьте параграф документации, почему вы должны были сделать что-то настолько глупое и сложное, а не просто перегружать + с double , Затем прочитайте этот абзац, передумайте и придерживайтесь + перегружен double ,

Class point c

Прошу прощения, действительно не подумал (затупил )

Я имел ввиду примерно следующее:
Как развивалось программирование в сторону повышения абстракции:
1) Команды процессора (АСМ) — никакой абстракции (от процессора)
2) Объединение команд процессора в Операторы — есть абстрагирование от процессора, но нет от языка программирования.
3) Объединение операторов в Методы — расширение количества «операторов», от языка далеко не ушло, данные как были общими, так и остались.
4) Группировка методов и данных в классы ( ООП ) — перемещение предметной области программирования от манипулирования числами к манипулирования объектам (почти) реального мира на интуитивно понятным образом.

Да вообще, почему ты привязалась к этому наследованию, не хочешь — не используй! (хотя полиморфизм — очень мощный аппарат).

Добавлено через 5 минут и 28 секунд

Разделить нужно, но вот воевать я не намерен. keenara, вот закончишь универ, получишь серьезный проект, . там посмотрим.

P.S. В моем текущем проекте ООП (а так же шаблоны проектирования) меня прям-таки спасает, так как у заказчиков 7 пятниц на неделе

Это сообщение отредактировал(а) ivashkanet — 8.5.2007, 12:55

Профиль
Группа: Участник
Сообщений: 3
Регистрация: 3.5.2007

Репутация: нет
Всего: нет

Кодю потиху

Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 9
Всего: 149

alesa, тебе же сказали, что у тебя не задание, а бред
Сходи к преподу и попроси, чтобы он объяснил «как можно наследовать прямую от точки».

Неформальное правило наследования: между наследником и родителем должно ( просто обязано ) присутствовать отношение является.
Например: Круг, Прямоугольник, Квадрат, Ромб являются Фигурами, поэтому они все могут (но не обязаны) быть наследниками класса Фигура.

Прямая же НЕ является точкой, так что о наследовании и речи быть не может.

Тут больше подходит агрегация (или композиция, не помню кто из них кто ): прямая содержит две точки (два ее конца)

Профиль
Группа: Участник
Сообщений: 3
Регистрация: 3.5.2007

Репутация: нет
Всего: нет

Эксперт

Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59

class Line : public Point
<
int x1,y1;
>;

оно конечно можно, но вспоминается анекдот:
Я печатаю со скоростью 300 знаков в минуту. Правда такая фигня получается.

Лично мне задание не понятно. Ну наследовать то кое-как можно (непонятно зачем, ну ладно), а собственно методы что должны делать?

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!

  • Название темы должно отражать её суть! (Не следует добавлять туда слова «помогите», «срочно» и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например «школьная задача», «задача из учебника» и т.п.), не нужно указывать ее сложность («простая задача», «легкий вопрос» и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку «Код»). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик — один вопрос!
  • В данном разделе запрещено поднимать темы , т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой «Пометить как решённый», которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector