Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > С/С++
Перезагрузить страницу Вопросы к знатокам C++ переучиваем с паскаля на си
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Sergey Sidorov Sergey Sidorov вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.03.2006
По умолчанию Вопросы к знатокам C++ переучиваем с паскаля на си - 24.03.2006, 18:43

Так уж получилось, учился программировать на паскале, но в ностоящее время надо писать на си. Нужна помощь на некоторые вопросы, кто знаком с двумя языками думаю меня поймет. Некоторые вещи могут не получаться в силу особенностей компилятора (для одна кристалки), но вроде ни чего "не стандартного" не использую. В тексте использую термены класс, метод, поле в силу привычки.

1. Как вызвать метод произвольного объекта по ссылке (механизм подобный событиям в дульфи). Пока приходиться вызывать функцию в которой прописан вызов метода объекта. Можно получить ссылку на метод конкретного класса, но это не не решает проблем.

2. В паскале есть удобный способ создания объектов (TBaseA, TBaseB.. потомк TBase):
type
TBaseClass = class of TBase;
const
SomeClasses: array [SomeCount] of TBaseClass = (TBaseA, TBaseB, ...);
...
AObject := SomeClasses[Index].Create();

3. Напрягает разница обращения к полям и методам объекта AObjetc.func1() и AObject->func1() в зависимоти от того через что обращаемя указатель или переменная. Смысл один, но читабельность тереяться.

4. Как правильно реализовывать данные класса (т.е. данные общие для всех объектов этого класса). Пока писал так, если вставить переменную в класс, компилятор ее не находит не по TObject:: не по TObject.
static int A;
class TObject {
static short GetA(void);
static void SetA(int Value);
...
}
...
доступ: TObject::Set() и TObject::Get()

5. Можно ли сделать подобное но тип не стуктура а класс.
struct TAA {
int F;
};
const TAA A = {1};
Как можно объявлять экземпляры класса константы, с заданием полей и можно ли реализовать иеархию классов, экземпляры которых будут константами.

6. Как правельно реализовать скрытие интерфейсов по модулям. К примеру, имеем несколько модулей.
--- AAAA.h ---
class TAAAA {
...
}
---AAA.h ---
class TAAA: public TAAAA{
private:
TAAAA AAAA;
---AA.h ---
class TAA: public TAAA{
private:
TAAA AAA;
...
}

Но для того чтобы использовать класс TAA прийдется писать:
#include "AAAA.h"
#include "AAA.h"
#include "AA.h"
Хотя поле описывается в закрытой чатси класса, и на паскале это не требуется.


7. Есть ли стандартная функция определения свободной динамической памяти, а если нет то как это делается.
Ответить с цитированием
  (#2 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,255
Сказал(а) спасибо: 27
Поблагодарили 51 раз(а) в 51 сообщениях
Регистрация: 16.10.2005
По умолчанию 24.03.2006, 23:32

1. Это в стандарте C++ вроде как нельзя. Есть обходные пути, например, в CBuilder введено ключевое слово __closure вроде именно для этого.

3. Дело привычки. На самом деле разница есть. C++ подчеркивает эту разницу, ObjectPascal замазывает.

4. Вставлять в класс static int A;. Доступ по TObject::A
А проблема, похоже, в том, что нет волшебного слова public, а без него оно private будет.

5. Вообще-то структура от класса отличается только тем, что все члены по умолчанию public

6. Каждый из этих классов должен сам повключать все необходимые ему хедеры. Их вовсе не надо все включать в оконечный файл.
Ответить с цитированием
  (#3 (permalink)) Старый
Huan Huan вне форума
Member
 
Сообщений: 79
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.01.2006
По умолчанию 25.03.2006, 12:28

7. При выделении памяти (new) возвращается указатель
на выделенную памыть, или NULL (посмотри справку по new)
Следовательно если получили не NULL, то память была выделенна[/code]
Ответить с цитированием
  (#4 (permalink)) Старый
Dian Dian вне форума
Member
 
Сообщений: 5,243
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.09.2004
По умолчанию 25.03.2006, 14:58

2 В С++ похоже нет - придется использовать что-то вроде фабричного метода
Ответить с цитированием
  (#5 (permalink)) Старый
Sergey Sidorov Sergey Sidorov вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.03.2006
По умолчанию 27.03.2006, 13:24

Цитата:
Originally posted by Huan
[b]7. При выделении памяти (new) возвращается указатель
на выделенную памыть, или NULL (посмотри справку по new)
Следовательно если получили не NULL, то память была выделенна[/code]
Т.е. через new выделять память блоками (по байту) и оставшаяся память будет равна сумме блоков, так я понимаю
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Sergey Sidorov Sergey Sidorov вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.03.2006
По умолчанию 27.03.2006, 13:34

Цитата:
Originally posted by Dian
[b]2 В С++ похоже нет - придется использовать что-то вроде фабричного метода
но как я понимаю и есть реализация фабричного метода? А реализовать его можно по разному и так и через switch, и if и еще как нибуть.
Ответить с цитированием
  (#7 (permalink)) Старый
Sergey Sidorov Sergey Sidorov вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.03.2006
По умолчанию 27.03.2006, 14:26

[quote]1. Это в стандарте C++ вроде как нельзя. Есть обходные пути, например, в CBuilder введено ключевое слово __closure вроде именно для этого.

>>>Слова такого у меня в компиляторе нет (IAR)

3. Дело привычки. На самом деле разница есть. C++ подчеркивает эту разницу, ObjectPascal замазывает.

>>> Согласен, но очень не удобно помнить как в каждом конкретном случае надо писать, и если чего переписывать все обращения

4. Вставлять в класс static int A;. Доступ по TObject::A
А проблема, похоже, в том, что нет волшебного слова public, а без него оно private будет.

>>>Не я так пробовал все равно не видит, видимо это особенности компилятора.

5. Вообще-то структура от класса отличается только тем, что все члены по умолчанию public

>>>Когда класс не откого не наследуется все получается. Но если есть наследования то ничего не выходит.

class TParentObject{
public:
int A;
};

class TObject: public TParentObject{
public:
int B;
};

TObject O = {10};

Error[Pe285]: initialization with "{...}" is not allowed for object of type "TObject __data" ...


6. Каждый из этих классов должен сам повключать все необходимые ему хедеры. Их вовсе не надо все включать в оконечный файл.

>>> Можте я не так понял ну вот что получается:
--- Unit.h ----
class TObject {..};
---UnitA.h---
#include "Unit.h"
class TObjectA: public TObject{...};
----UnitB.h---
#include "Unit"
class TObjectB: public TObject{...};
----Mian.cpp----
#include "UnitA.h"
#include "UnitB.h"
...
-------------------------
компилятор в полне логично пишет:
Error[Pe256]: invalid redeclaration of type name "TObject"
Ответить с цитированием
  (#8 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,255
Сказал(а) спасибо: 27
Поблагодарили 51 раз(а) в 51 сообщениях
Регистрация: 16.10.2005
По умолчанию 27.03.2006, 14:45

6. Борьба против повторного включения хедеров ведется так:
Код:
#ifndef unit1h
#define unit1h
....
#endif
Ответить с цитированием
  (#9 (permalink)) Старый
Sergey Sidorov Sergey Sidorov вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.03.2006
По умолчанию 27.03.2006, 16:14

Цитата:
Originally posted by Alexiski
[b]6. Борьба против повторного включения хедеров ведется так:
Код:
#ifndef unit1h
#define unit1h
....
#endif
Спасибо.
Ответить с цитированием
  (#10 (permalink)) Старый
Dian Dian вне форума
Member
 
Сообщений: 5,243
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.09.2004
По умолчанию 27.03.2006, 17:34

Цитата:
А реализовать его можно по разному
Вот-вот. Остаются if и switch
Цитата:
6. Борьба против повторного включения хедеров ведется так:
Иногда еще помогает #pragma once
Ответить с цитированием
  (#11 (permalink)) Старый
Sergey Sidorov Sergey Sidorov вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.03.2006
По умолчанию 28.03.2006, 15:06

Всем большое спасибо за помощь.
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос знатокам. andrik23 Вопросы начинающих программистов 6 10.03.2012 21:00
C паскаля на с++ cfexe Вопросы начинающих программистов 3 17.12.2011 01:34
ПОМОГИТЕ перевести с паскаля на С или С++ Ииринка Вопросы начинающих программистов 0 29.04.2011 00:13
Перевести с Паскаля на С++ =Anet= Задания за деньги 4 21.03.2011 12:08
Перевод из Паскаля в С++ как реализовать links С/С++ 7 11.09.2009 16:56
знатокам Virtual CD7 *АЛХИМИК* Софт и программы 1 07.03.2009 15:28
Вопрос к знатокам Vista Валерий Windows Vista 28 25.05.2008 22:51
Знатокам реестра!!! valdon Софт и программы 3 14.04.2008 00:55
Преобразовать из Паскаля в Си. Niko Prolog 1 04.10.2007 21:07
Треугольник Паскаля на Прологе imported_Sniper Prolog 6 23.11.2006 02:18
Треугольник Паскаля на Лиспе imported_Sniper Lisp 2 11.05.2005 18:16
Помогите с установкой Паскаля swater Pascal 2 09.03.2004 15:26



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов