Visual Studio 2010 на попытку создать свойство у класса пишет:
error C3813: a property declaration can only appear within the definition of a managed type
Но ведь C++ Builder всё работает, и никакого CLR эта среда не требует. Ставлю enable CLR. Вижу кучу ошибок запуска компилятора. Гуглю по каждой ошибке, отключаю все опции (нет чтобы вывалить сразу все, ругается на каждую опцию по одной, но ладно, это хоть бесит, но хотя бы решаемо). В итоге Студия перестаёт подчёркивать свойства в редакторе кода, но все ошибки компиляции остаются.
Я понимаю, что самый правильный совет в данной ситуации - вообще не использовать Visual Studio для программирования на C++, но у меня есть ученик, от которого это требуют в ВУЗе. Может, к ней хотя бы можно подключить нормальный сторонний компилятор?
class rectangle
{
private:
double left;
double top;
double height;
double width;
double get_right();
double get_bottom();
public: // Открытые члены класса
rectangle(); // Конструкторы
rectangle(double left, double top,
double height, double width);
// Методы
void move(double left, double top);
void resize(double height, double width);
// Свойства
__property double Left = { read = left };
__property double Top = { read = top };
__property double Height = { read = height };
__property double Width = { read = width };
__property double Right = { read = get_right };
__property double Bottom = { read = get_bottom };
};
В чистом С++ синтаксически нет такого понятия как "свойства" (функции, выглядящие как одно поле и проксирующие получение/установку значения). Компиляторы реализуют это кто во что горазд: вместо борландовского
__property Type name = { read = getter, write = setter };
в Visual Studio нужно писать:
__declspec(property( get = getter, put = setter )) Type name;
Можно исправлять примеры руками. А можно написать макросы PROP
и AUTO_PROP
, определяющий тип компилятора и подставляющий правильный код (аналогично делается для read-only и write-only свойств):
#ifdef _MSC_VER
#define PROP(Type, name, setter, getter) \
__declspec(property( get = getter, put = setter )) Type name;
#define AUTO_PROP(Type, name) \
private: \
Type _##name; \
Type get_##name() const { return _##name; } \
void set_##name(const Type& name) { _##name = name; } \
public: __declspec(property( \
get = get_##name, \
put = set_##name )) \
Type name;
#elif defined(__BORLANDC__)
#define PROP(Type, name, setter, getter) \
__property Type name = { read = getter, write = setter };
#define AUTO_PROP(Type, name) \
private: \
Type _##name; \
Type get_##name() const { return _##name; } \
void set_##name(const Type& name) { _##name = name; } \
public: __property Type name = { \
read=get_##name, \
write=set_##name };
#endif
Но все равно это не будет чистым С++ и другой тип компилятора такой код может не принять. Другой вариант, который соберется любым компилятором, но для клиента свойство будет выглядеть как функция:
#define AUTO_PROP(Type, name) \
private: Type _##name; \
public: \
Type name() const { return _##name; } \
void name(const Type& name) { _##name = name; }
Объявляется все это так:
class Note {
public:
PROP(int, id, getter, setter);
AUTO_PROP(std::string, title);
AUTO_PROP(std::string, content);
private:
int getter() const;
void setter(int id);
};
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть кнопка в ob_panelui - on_pB_Switch_clicked и элемент в mainwindow
Стоит задача, водится строка, при выводе должно быть две строки, одна выводит символы только верхнего регистра, вторая только нижнегоНачал...
Изучаю вывод типов в С++, и использую метод name() класса std::type_info, для печати типа, который имеет переменная: