Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

C Чем это может быть связано. vector feat. __property

299
14 сентября 2005 года
3D Bob
885 / / 18.04.2005
При компиляции программы, вылетает на внутерннем коде вектора с такой вот ошибкой.
Цитата:

Build
[C++ Error] _vector.h(354): E2328 Classes with properties cannot be copied by value
[C++ Error] _algobase.h(183): E2328 Classes with properties cannot be copied by value
[C++ Error] _algobase.h(145): E2328 Classes with properties cannot be copied by value


Что написано понимаю, а с чем то связано нет:(

Классы с пропертисами не могут быть скопированы в значение вектора?

3
14 сентября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by 3D Bob
При компиляции программы, вылетает на внутерннем коде вектора с такой вот ошибкой.

Что написано понимаю, а с чем то связано нет:(

Классы с пропертисами не могут быть скопированы в значение вектора?



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

299
14 сентября 2005 года
3D Bob
885 / / 18.04.2005
Цитата:
Originally posted by Green
Сдается мне, ты не создал конструктора копирования и оператора присваивания для класса который в вектор кладешь.



Класс примерно такой..

Код:
class TCol{
public:
        __fastcall TCol(){};
        vector<AnsiString> Row; // Строки
        __property int S={read=Color,write=Color}; // Это для тестирования
        String __fastcall GetValue(int);
        AnsiString Title; // Заголовок
        AnsiString Field;
        bool Visible;
        bool Union;
        bool Dynamic;
        AnsiString Union_Field;
        int Color;
        int Type;
        AnsiString Params;
};

Что значит конструктор копирования? Как его нужно делать?
Дело в том, что ДО того как я ввел ПРОПЕРТИСЫ, всё работало нормально. Но я начал усовершенствовать класс, и вылезла фигня:(
C созданием операторов еще никогда не работал.
Был бы очень признателен, если покажете пример.
3
14 сентября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by 3D Bob
Класс примерно такой..
<skip>


Ну точно, нет конструктора копирования и оператора присваивания

Цитата:
Originally posted by 3D Bob

Что значит конструктор копирования? Как его нужно делать?


 
Код:
TCol::TCol(const TCol& src)
{
  Title = src.Title;
  Field = src.Field;
    ............. и т.д.
}


Цитата:
Originally posted by 3D Bob

Дело в том, что ДО того как я ввел ПРОПЕРТИСЫ, всё работало нормально. Но я начал усовершенствовать класс, и вылезла фигня:(


__property - это расширение языка от Борланда, в стандартном С++ этого нет, и не нужно!
Эта фигня была введена видимо для совместимости с Delphi.
Зачем она тебе нужна?
Кроме того, как мне кажется там должны упоминаться методы, а не поля, т.е что-то типа:

 
Код:
int getColor();
void setColor(int);
__property int S={read=getColor,write=setColor};

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

Цитата:
Originally posted by 3D Bob

C созданием операторов еще никогда не работал.
Был бы очень признателен, если покажете пример.


 
Код:
const TCol& TCol::operator= (const TCol& src)
{
  // как в конструкторе копирования

  return *this;
}
299
14 сентября 2005 года
3D Bob
885 / / 18.04.2005
Цитата:
Originally posted by Green
Ну точно, нет конструктора копирования и оператора присваивания
 
Код:
TCol::TCol(const TCol& src)
{
  Title = src.Title;
  Field = src.Field;
    ............. и т.д.
}

Кажеться понел. Он не знает как копировать пропертисы.

Цитата:

__property - это расширение языка от Борланда, в стандартном С++ этого нет, и не нужно!
Эта фигня была введена видимо для совместимости с Delphi.
Зачем она тебе нужна?

У, с ними так приятно работать,
Просто взял присвоил какое-то значение, и одновременная выполнилась ф-ция.
a=5;
Бах, и появилось 5 чего-то там)))

Цитата:

Кроме того, как мне кажется там должны упоминаться методы, а не поля, т.е что-то типа:
 
Код:
int getColor();
void setColor(int);
__property int S={read=getColor,write=setColor};

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


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


Цитата:

 
Код:
const TCol& TCol::operator= (const TCol& src)
{
  // как в конструкторе копирования

  return *this;
}


Огромное спасибо Вам. Буду думать как это применять теперь)
Идею и фишку я уловил, для чего они и когда выполняются.

310
15 сентября 2005 года
fellow
853 / / 17.03.2003
В общем то создавать конструктор по умолчанию и оператор присваивания не обязательно, т.к. компилятор способен сделать это самостоятельно.
585
15 сентября 2005 года
honeybeer
297 / / 06.09.2004
Цитата:
Originally posted by fellow
В общем то создавать конструктор по умолчанию и оператор присваивания не обязательно, т.к. компилятор способен сделать это самостоятельно.


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

310
15 сентября 2005 года
fellow
853 / / 17.03.2003
Цитата:
Originally posted by honeybeer
К сожалению компилятор реализует буквальное копирование, что в некоторых случаях приводит к печальным последствиям.


Эти случаи я предусмотрел :), потому то и написал "в общем" и "не обязательно" :)

246
15 сентября 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by 3D Bob
Класс примерно такой..
Код:
class TCol{
public:
        __fastcall TCol(){};
        vector<AnsiString> Row; // Строки
        __property int S={read=Color,write=Color}; // Это для тестирования
        String __fastcall GetValue(int);
        AnsiString Title; // Заголовок
        AnsiString Field;
        bool Visible;
        bool Union;
        bool Dynamic;
        AnsiString Union_Field;
        int Color;
        int Type;
        AnsiString Params;
};

Что значит конструктор копирования? Как его нужно делать?
Дело в том, что ДО того как я ввел ПРОПЕРТИСЫ, всё работало нормально. Но я начал усовершенствовать класс, и вылезла фигня:(
C созданием операторов еще никогда не работал.
Был бы очень признателен, если покажете пример.


компили на здоровье...

Код:
#include <vector>
...
typedef std::vector<AnsiString> RowList;
...
class TCol{
public:
        __fastcall TCol(){};
        RowList Row; // Строки
        __property int S={read=Color,write=Color}; // Это для тестирования
        String __fastcall GetValue(int);
        AnsiString Title; // Заголовок
        AnsiString Field;
        bool Visible;
        bool Union;
        bool Dynamic;
        AnsiString Union_Field;
        int Color;
        int Type;
        AnsiString Params;
};


P.S.
1. "Почему не сделать класс, а-ля-Борланд, заглянув в хедеры которые генерит сам Билдер?" Индексированное сво-во прошло-бы на ура.

2. А Green-a Ты не слушай, проперти они хорошие(как и кошки) он просто не умеет их готовить!
299
15 сентября 2005 года
3D Bob
885 / / 18.04.2005
Цитата:
Originally posted by GIZMO
компили на здоровье...



Дело в том что ошибка возникает не от этого вектора. Есть еще больее базовый класс, как не трудно догадаться, который хранит Столбцы.

Код:
class TData{
private:
        int COUNTCOL;
        int __stdcall GetCountCol(){return (int)this->Col.size();};
        int __stdcall GetCountRow(){return (int)this->Col[0].Row.size();};
        int __stdcall GetVisibleCol();
public:
        [color=red]vector<TCol> Col; // Класс выше, который содержит пропертис[/color]
        TCol __stdcall FindByName(AnsiString);
        void Clear(){Col.clear();};
        __property int CountCol = {read=GetCountCol, write = COUNTCOL};
        __property int CointRow = {read=GetCountRow, write = COUNTCOL};
        __property int CountVisibleCol = {read=GetVisibleCol, write=COUNTCOL};
};
[color=red]Этот класс компилиться нормльно, если класс выше не содержит, пропертисов.[/color]

Я б рад определять их как отдельный тип...
Но вылетает, на ошибке в КОДЕ вектора...
Код:
template <class _RandomAccessIter, class _OutputIter, class _Distance>
inline _OutputIter
__copy(_RandomAccessIter __first, _RandomAccessIter __last,
       _OutputIter __result, const random_access_iterator_tag &, _Distance*) {
  for (_Distance __n = __last - __first; __n > 0; --__n) {
    *__result = *__first;
    ++__first;
    ++__result;
  }
  return __result;
}

:(

Цитата:

1. "Почему не сделать класс, а-ля-Борланд, заглянув в хедеры которые генерит сам Билдер?" Индексированное сво-во прошло-бы на ура.


Я в них последнее время ОЧЕНЬ переодично смотрю. Но чтобы борладн юзайл вектор пока не видел:(


На всякий случай, сделал так.

Код:
typedef vector<AnsiString> RowList;
class TCol{
private:

public:
        __fastcall TCol(){};
        RowList Row; // &#209;&#242;&#240;&#238;&#234;&#232;
       __property int S={read=Color,write=Color}; <skip>
};
typedef vector<TCol> ColList;
class TData{
<skip>
public:
        ColList Col;
        <skip>
};

Тоже самое:((((
246
15 сентября 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by 3D Bob
Дело в том что ошибка возникает не от этого вектора. Есть еще больее базовый класс, как не трудно догадаться, который хранит Столбцы.


Дак Ты приводи нужный код, а то Я недогадливый:)

Цитата:
Originally posted by 3D Bob

Я в них последнее время ОЧЕНЬ переодично смотрю. Но чтобы борладн юзайл вектор пока не видел:(


...да 4е Ты докопался до вектора, нахер он нужен, используй индексированное св-во

 
Код:
TCol FCol;
    void __fastcall SetCol(int ACol, TCol value);
public:
    __property TCol Col[int ACol]  = { read=FCol, write=SetCol };

или коллекцию...
585
15 сентября 2005 года
honeybeer
297 / / 06.09.2004
Цитата:
Originally posted by GIZMO
Дак Ты приводи нужный код, а то Я недогадливый:)


...да 4е Ты докопался до вектора, нахер он нужен, используй индексированное св-во
 
Код:
TCol FCol;
    void __fastcall SetCol(int ACol, TCol value);
public:
    __property TCol Col[int ACol]  = { read=FCol, write=SetCol };

или коллекцию...


Банальный TStringList будет тебе опорой :D
Для AnsiString лучше и не надо.

299
15 сентября 2005 года
3D Bob
885 / / 18.04.2005
Цитата:
Originally posted by GIZMO
...да 4е Ты докопался до вектора, нахер он нужен, используй индексированное св-во


пытался, а где и как хранить данные? В чем?
Юзать new?

Мне нужен лист моего TCol а не Стирнга.
И TStringList, категарически использовать не буду.
Первое он очень тяжелый и имеет много лишнего.
Второе я стараюсь максимум уходить от ВКЛ.

Индексированое свойство использовать умею...
Но все эти проблемы заставлюят извращаться...
Лучше оставлю как есть, и буду вместо пропертисов, юзать те ф-ции которые они вызывают. А в будушем уже думать и знать, что копировать проперитсы вектор не умеет.

299
15 сентября 2005 года
3D Bob
885 / / 18.04.2005
Юзать какие-то методы не проблема.
Я могу извращаться по разному.
Но вот в чем хранить данные, вот эт проблема.
Сейчас идея только одна.
Вектор использовать для хранения указателей TCol, сам же TCol хранить в куче.

Цитата:

Банальный TStringList будет тебе опорой


Очень прошу не предлагать в качестве решения проблем, ВКЛ. Ну не переношу я его.. Использую, только из-за того что больше нечего.

246
15 сентября 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by 3D Bob
пытался, а где и как хранить данные? В чем?
Юзать new?


еще раз, - исходники TStringGrid открывал? Св-во Objects...

Цитата:
Originally posted by 3D Bob

Мне нужен лист моего TCol а не Стирнга.
И TStringList, категарически использовать не буду.
Первое он очень тяжелый и имеет много лишнего.


не ко мне, skip...

Цитата:
Originally posted by 3D Bob

Второе я стараюсь максимум уходить от ВКЛ.


гы-гы ... снимаю шляпу перед мастером

Цитата:
Originally posted by 3D Bob

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


уходить от VCL, работая на Билдере это извращение...

299
15 сентября 2005 года
3D Bob
885 / / 18.04.2005
Цитата:
Originally posted by GIZMO
еще раз, - исходники TStringGrid открывал? Св-во Objects...


не ко мне, skip...


гы-гы ... снимаю шляпу перед мастером


уходить от VCL, работая на Билдере это извращение...



Не буду спорить. Дело вкуса.
ГИЗМО, к вам у меня большое уважание.
Просто не хочу полностью полагаться на среду разработки. Хотя с проперитсами я именно так и делаю...
Но всё же.
В дальнейшем планирую переходить на Вижуал. Поэтому и готовлю себя.

 
Код:
еще раз, - исходники TStringGrid открывал? Св-во Objects...

К гриду мои классы имеют лишь косвенно отношения...
Он не подходит.
У меня в самом базовом классе, моего TData Грида нет.
Грид лишь изредка используется чтобы отобразить данные.
В некоторых с лучаях Грида вообще может и не быть, а данныех в паямти храниться должны.
246
15 сентября 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by 3D Bob

К гриду мои классы имеют лишь косвенно отношения...
Он не подходит.
У меня в самом базовом классе, моего TData Грида нет.
Грид лишь изредка используется чтобы отобразить данные.
В некоторых с лучаях Грида вообще может и не быть, а данныех в паямти храниться должны.


... посмотри как реализовано св-во Objects[][](Я тебе и не говорил грид использовать).
Ну или создай оболчку для TList проще, простого....

299
15 сентября 2005 года
3D Bob
885 / / 18.04.2005
Цитата:
Originally posted by GIZMO
... посмотри как реализовано св-во Objects[][](Я тебе и не говорил грид использовать).
Ну или создай оболчку для TList проще, простого....


Аааааааааааааааааааа=)))
Хорошо спасибо. Ушел углубляться):D :)
Суть уловил.


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

299
16 сентября 2005 года
3D Bob
885 / / 18.04.2005
Кароче ребят, вектор не для хранения тяжелых объектов.
Очень часто случаеться что он гибнет.
Начал обращаться к нему через форму, пожалуйста выскачила ошибка
 
Код:
size_type size() const        { return size_type(this->_M_finish - this->_M_start); }

Что вот где-то сделать что-то не так. Причем ошибка не при компиляции, а во время выполнения программы.
Ошибка доступа к памяти....
3
16 сентября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by 3D Bob
Кароче ребят, вектор не для хранения тяжелых объектов.


Ты сможешь назвать конкретную строку в стандарте, где это сказано? :D
Если нет, то нет смысла что-либо постулировать.

299
16 сентября 2005 года
3D Bob
885 / / 18.04.2005
Цитата:
Originally posted by Green
Ты сможешь назвать конкретную строку в стандарте, где это сказано? :D
Если нет, то нет смысла что-либо постулировать.

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

[size=3]Кароче теперь кроме как указателей я ему не доверю хранить, он меня подводит в самый ответсвенный момент. [/size]

3
16 сентября 2005 года
Green
4.8K / / 20.01.2000
Все дело в кривости рук и незнания матчасти, а не в векторе.
299
16 сентября 2005 года
3D Bob
885 / / 18.04.2005
Цитата:
Originally posted by Green
Все дело в кривости рук и незнания матчасти, а не в векторе.


У меня в одном месте он работает в другом нет.
....
Конечно кивости рук. Я другого ответа не ожидал...
:(
Бесит то что даже не знаешь с какой стороны, подойти к решению проблемы...
ОШИБКА в несанкционированном обращении к памяти...:(

3
16 сентября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by 3D Bob
У меня в одном месте он работает в другом нет.
....
Конечно кивости рук. Я другого ответа не ожидал...
:(
Бесит то что даже не знаешь с какой стороны, подойти к решению проблемы...
ОШИБКА в несанкционированном обращении к памяти...:(



Ну так приведи пример кода (только не весь), попробуем помочь.

299
16 сентября 2005 года
3D Bob
885 / / 18.04.2005
Цитата:
Originally posted by Green
Ну так приведи пример кода (только не весь), попробуем помочь.


Весь код приводит конешно не стану, он на несколько страниц.
Всё, спасибо, за отклик.
Но я победил)))), я дурак.
Я уже и забыл как работает мой старый модуль, который я писал пару месяцев назад.
Но пользуюсь им по сей день. И не помнил уже где в нем что как просиходит. Действительно, я пытался прочитать данные в векторе, которых там еще не было:(
У меня эти данные заполнялись несколько позже оказывается чем я ожидал. Сейчас по ступенькам поднялся вверх и все увидел)

3
16 сентября 2005 года
Green
4.8K / / 20.01.2000
Замечание на будущее:
если ты держишь в контейнере объекты, то работать с указателями на них следует крайне осторожно, а лучше вообще не ссылаться по указателю.
299
16 сентября 2005 года
3D Bob
885 / / 18.04.2005
Цитата:
Originally posted by Green
Замечание на будущее:
если ты держишь в контейнере объекты, то работать с указателями на них следует крайне осторожно, а лучше вообще не ссылаться по указателю.



Спасибо.
Но проблема была вот в чем...

Была такая ф-ция к еще не заполненому вектору.

 
Код:
TCol & __stdcall TData::FindByName(AnsiString Str){
        unsigned int i;
        for (i=0; i<Col.size(); i++)
                if (Col.Field == Str)
                        break;
        return Col;
}

Ф-ция соствлено некорректно без проверки на ошибки и возварщения кода ошибки. Понел, знаю.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог