Войти
ПрограммированиеФорумОбщее

[C++]Свои строки

Страницы: 1 2 Следующая »
#0
18:56, 24 фев. 2016

В С++ разбираюсь не очень хорошо, поэтому потребовалась помощь. Пишу свой класс реализации строк, основная особенность - он должен быть полностью бинарно совместим с BSTR. Т.е. я должен иметь возможность через reinterpret_cast приводить мой класс к BSTR и обратно. Нужно это для создания нормальных интерфейсов для .NET-клиента.
На вскидку видится, что структура класса должна быть следующая:

template<int StringLength> class String
{
private:
  DWORD _length;
  WCHAR _data[StringLength];
};
Можно для этого класса в каком-то виде сделать базовый, который можно было бы в методах интерфейса передавать как параметр?


#1
19:14, 24 фев. 2016

Может как-то так:

+ Показать

#2
19:23, 24 фев. 2016

nes
Хорошая мысль, так даже лучше, т.к. строки можно передавать по значению. Спасибо.

#3
19:27, 24 фев. 2016

Сам Microsoft в ATL в классе CComBSTR поступило очень просто - единственный член данных этого класса это собственно BSTR m_str; Все методы - есть просто обёртки над семейством функци Sys*String*, поэтому совместимость поистине обоюдная.

#4
17:17, 26 фев. 2016

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

#5
18:12, 26 фев. 2016

WCHAR, DWORD... Зачем? Если очень охота utf-16/utf-32 то лущ char16_t/char32_t.

#6
18:16, 26 фев. 2016

typedef
> WCHAR, DWORD... Зачем?
SamGrey
> должен быть полностью бинарно совместим с BSTR

#7
18:25, 26 фев. 2016

SamGrey
> он должен быть полностью бинарно совместим с BSTR
А смысл? Бинарная совместимость штука неблагодарнаяSamGrey
> Нужно это для создания нормальных интерфейсов для .NET-клиента.
Чем прослойка на Managed C++ не угодила?

#8
20:51, 26 фев. 2016
typedef BSTR MoyaStroka;
#9
21:06, 26 фев. 2016

PANDA
> typedef BSTR MoyaStroka;

чотко!

#10
21:30, 26 фев. 2016

вопрос к знатокам - как можно при присваивании одного vector другому просто "передать" данные одного другому? Без реального их копирования???

#11
21:49, 26 фев. 2016

static_cast
v1 = std::move(v2);

#12
21:54, 26 фев. 2016

SamGrey

struct MyBSTR
{
  int _length;
  wchar_t _data[];
  operator wchar_t*() { return _data; }
};

template<int StringLength>
struct String
{
  int _length;
  wchar_t _data[StringLength];
  operator MyBSTR*() { return reinterpret_cast<MyBSTR*>(this); }
};
#13
17:12, 27 фев. 2016

позволю себе ещё вопрос задать:

class SomeOtherClass
{
  int val;
public:

  explicit SomeOtherClass(int val=0) :val(val)
  {
  }

};

class SomeClass
{
  SomeOtherClass** p;
public:

  SomeClass(SomeOtherClass **p = 0) :p(p)
  {
  }
};

vector<SomeClass> v;

void some()
{
  int mm = 10;
  int hh = 10;
  int ww = 10;

  for (int i = 0; i < mm; i++)
  {
    SomeOtherClass** p = new SomeOtherClass*[hh];

    for (int j = 0; j < hh; j++)
    {
      p[j] = new SomeOtherClass[ww];

      for (int k = 0; k < ww; k++)
      {
        p[j][k] = SomeOtherClass(15);
      }
    }

    v.push_back(SomeClass(p));
  }
}

функция some. Когда может возникнуть ситуация, что в элементах v окажутся указатели на указатели с уже "уничтоженными" данными (т.е. при доступе по эл-там p в экземплярах SomeClass в v будет возникать исключение нарушения доступа для чтения)?

some и v необязательно глобальные, но могут быть и элементами описания класса!

#14
18:28, 27 фев. 2016

static_cast
> Когда может возникнуть ситуация, что в элементах v окажутся указатели на
> указатели с уже "уничтоженными" данными (т.е. при доступе по эл-там p в
> экземплярах SomeClass в v будет возникать исключение нарушения доступа для
> чтения)?
Когда кто-нибудь удалит экземпляр и не уберёт его из контейнера.
Кстати об удалении, а кто будет все эти экземпляры удалять? Как и массивы.

Страницы: 1 2 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.