Конвертирование класса C++ под FPC

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Конвертирование класса C++ под FPC

Сообщение KUKA » 23.08.2013 20:47:08

Значит есть некий класс, типа менеджер для текстур. Достаточно удобный, элементы удаляются сами, если нет ссылающихся на них ETypesHandle
Код: Выделить всё
namespace core{
    class ETypesHandle{
        friend class ETypesFactory;

    private:
        mutable EBaseType* value;
    public:
        unsigned int id;
        ETypesHandle();
        ETypesHandle(const ETypesHandle& _handle);
        ~ETypesHandle();

        ETypesHandle& operator= (const ETypesHandle& _handle);
        bool operator == (const ETypesHandle& _handle) const;
        bool operator != (const ETypesHandle& _handle) const;
        void null();
    };

    class ETypesFactory
    {
    private:
        static std::vector<unsigned int> free_entities;
        static std::vector<EBaseType*> entities;
    public:
        ETypesFactory();
        static ETypesHandle create(core::EDITOR_TYPE type, EBaseType** value = 0);
        static bool free(const ETypesHandle& handle);
        static EBaseType* get(const ETypesHandle& handle);
        static bool is_valid(const ETypesHandle& handle);
        static void release(core::EDITOR_TYPE type = core::_ET_ANY);
    };
}

// ......


EBaseType* core::ETypesFactory::get(const ETypesHandle &handle)
{
    EBaseType* result = 0;

    if(is_valid(handle)){
        result = handle.value;
    }

    return result;
}

bool core::ETypesFactory::is_valid(const ETypesHandle &handle)
{
    size_t use_sz = entities.size();
    bool result = false;

    if(handle.value && use_sz > handle.id){
        if(entities[handle.id] == handle.value){
            result = true;
        }
    }

    return result;
}


Какой аналог можно придумать? namespace'ы фиг с ним, из-за модульной структуры построения я и так могу обращаться к классу по имени_модуля.имя_класса, так что область имен мне не нужна. Про дружественные классы нашел только различные хаки, с использованием стороннего класса и то, вроде как для protected методов возможно. Перегрузи оператора присваивания нет, что здесь можно сделать? Вполне возможно, скорее всего можно обойтись и без mutable.
KUKA
новенький
 
Сообщения: 46
Зарегистрирован: 22.02.2012 20:54:19

Re: Конвертирование класса C++ под FPC

Сообщение Kitayets » 17.09.2013 00:25:53

классы объявленные в одном модуле - по сути повторяют дружественные классы из c++. Т.е. эти классы имеют доступ к private методам/полям классов объявленным в этом же модуле. Все функции/процедуры объявленные в этом же модуле - будут дружественны к классам.

Добавлено спустя 1 минуту 55 секунд:
вот пример:
Код: Выделить всё
program project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes
  { you can add units after this };

{$R *.res}
type

  { TA }

  TA = class
  private
    fa: string;
    procedure getA;
  public
    fb: string;
    constructor Create;
    procedure getB;
  end;

  { TB }

  TB = class
  private
    fa: TA;
  public
    constructor Create(a: TA);
    procedure test_public;
    procedure test_private;
    procedure test_private_field;
  end;

{ b }

constructor TB.Create(a: TA);
begin
  fa:= a;
end;

procedure TB.test_public;
begin
  fa.getB;
end;

procedure TB.test_private;
begin
  fa.getA;
end;

procedure TB.test_private_field;
begin
  writeln(fa.fa);
end;

{ a }

procedure TA.getA;
begin
  writeln(fa);
end;

constructor TA.Create;
begin
  fa:= 'private string.';
  fb:= 'public string.';
end;

procedure TA.getB;
begin
  writeln(fb);
end;

var
  a: TA;
  b: TB;

begin
  a:= TA.Create;
  b:= TB.Create(a);
  b.test_public;
  b.test_private;
  b.test_private_field;

end. 


вот вывод:
yr@dream friends_test]$ ./project1
public string.
private string.
private string.

[yr@dream friends_test]$


Добавлено спустя 14 минут 53 секунды:
И перегрузка оператора присваивания есть (во всяком случае в диалекте - object free pascal).

Вот тут смотри: http://freepascal.org/docs-html/ref/refse86.html
и тут: http://freepascal.org/docs-html/ref/refse87.html

как mutable заменить - фиг знает
Kitayets
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru