C Чем это может быть связано. vector feat. __property
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
Что написано понимаю, а с чем то связано нет:(
Классы с пропертисами не могут быть скопированы в значение вектора?
При компиляции программы, вылетает на внутерннем коде вектора с такой вот ошибкой.
Что написано понимаю, а с чем то связано нет:(
Классы с пропертисами не могут быть скопированы в значение вектора?
Сдается мне, ты не создал конструктора копирования и оператора присваивания для класса который в вектор кладешь.
Сдается мне, ты не создал конструктора копирования и оператора присваивания для класса который в вектор кладешь.
Класс примерно такой..
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 созданием операторов еще никогда не работал.
Был бы очень признателен, если покажете пример.
Класс примерно такой..
<skip>
Ну точно, нет конструктора копирования и оператора присваивания
Что значит конструктор копирования? Как его нужно делать?
{
Title = src.Title;
Field = src.Field;
............. и т.д.
}
Дело в том, что ДО того как я ввел ПРОПЕРТИСЫ, всё работало нормально. Но я начал усовершенствовать класс, и вылезла фигня:(
__property - это расширение языка от Борланда, в стандартном С++ этого нет, и не нужно!
Эта фигня была введена видимо для совместимости с Delphi.
Зачем она тебе нужна?
Кроме того, как мне кажется там должны упоминаться методы, а не поля, т.е что-то типа:
void setColor(int);
__property int S={read=getColor,write=setColor};
Это я предполагаю, т.к. с борландом не работаю.
Но опять же, эти проперсы чужды языку программирования С++. Не используй ты их.
C созданием операторов еще никогда не работал.
Был бы очень признателен, если покажете пример.
{
// как в конструкторе копирования
return *this;
}
Ну точно, нет конструктора копирования и оператора присваивания
{
Title = src.Title;
Field = src.Field;
............. и т.д.
}
Кажеться понел. Он не знает как копировать пропертисы.
__property - это расширение языка от Борланда, в стандартном С++ этого нет, и не нужно!
Эта фигня была введена видимо для совместимости с Delphi.
Зачем она тебе нужна?
У, с ними так приятно работать,
Просто взял присвоил какое-то значение, и одновременная выполнилась ф-ция.
a=5;
Бах, и появилось 5 чего-то там)))
Кроме того, как мне кажется там должны упоминаться методы, а не поля, т.е что-то типа:
void setColor(int);
__property int S={read=getColor,write=setColor};
Это я предполагаю, т.к. с борландом не работаю.
Но опять же, эти проперсы чужды языку программирования С++. Не используй ты их.
Не, с этим всё прально, я с пропертисами давно работаю. Знаю что в них да как.
Но наверное откажусь, мдааааааа, тяжело будет если чесно...
{
// как в конструкторе копирования
return *this;
}
Огромное спасибо Вам. Буду думать как это применять теперь)
Идею и фишку я уловил, для чего они и когда выполняются.
В общем то создавать конструктор по умолчанию и оператор присваивания не обязательно, т.к. компилятор способен сделать это самостоятельно.
К сожалению компилятор реализует буквальное копирование, что в некоторых случаях приводит к печальным последствиям.
К сожалению компилятор реализует буквальное копирование, что в некоторых случаях приводит к печальным последствиям.
Эти случаи я предусмотрел :), потому то и написал "в общем" и "не обязательно" :)
Класс примерно такой..
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 созданием операторов еще никогда не работал.
Был бы очень признателен, если покажете пример.
компили на здоровье...
...
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 Ты не слушай, проперти они хорошие(как и кошки) он просто не умеет их готовить!
компили на здоровье...
Дело в том что ошибка возникает не от этого вектора. Есть еще больее базовый класс, как не трудно догадаться, который хранит Столбцы.
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};
};
Я б рад определять их как отдельный тип...
Но вылетает, на ошибке в КОДЕ вектора...
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. "Почему не сделать класс, а-ля-Борланд, заглянув в хедеры которые генерит сам Билдер?" Индексированное сво-во прошло-бы на ура.
Я в них последнее время ОЧЕНЬ переодично смотрю. Но чтобы борладн юзайл вектор пока не видел:(
На всякий случай, сделал так.
class TCol{
private:
public:
__fastcall TCol(){};
RowList Row; // Ñòðîêè
__property int S={read=Color,write=Color}; <skip>
};
typedef vector<TCol> ColList;
class TData{
<skip>
public:
ColList Col;
<skip>
};
Тоже самое:((((
Дело в том что ошибка возникает не от этого вектора. Есть еще больее базовый класс, как не трудно догадаться, который хранит Столбцы.
Дак Ты приводи нужный код, а то Я недогадливый:)
Я в них последнее время ОЧЕНЬ переодично смотрю. Но чтобы борладн юзайл вектор пока не видел:(
...да 4е Ты докопался до вектора, нахер он нужен, используй индексированное св-во
void __fastcall SetCol(int ACol, TCol value);
public:
__property TCol Col[int ACol] = { read=FCol, write=SetCol };
или коллекцию...
Дак Ты приводи нужный код, а то Я недогадливый:)
...да 4е Ты докопался до вектора, нахер он нужен, используй индексированное св-во
void __fastcall SetCol(int ACol, TCol value);
public:
__property TCol Col[int ACol] = { read=FCol, write=SetCol };
или коллекцию...
Банальный TStringList будет тебе опорой :D
Для AnsiString лучше и не надо.
...да 4е Ты докопался до вектора, нахер он нужен, используй индексированное св-во
пытался, а где и как хранить данные? В чем?
Юзать new?
Мне нужен лист моего TCol а не Стирнга.
И TStringList, категарически использовать не буду.
Первое он очень тяжелый и имеет много лишнего.
Второе я стараюсь максимум уходить от ВКЛ.
Индексированое свойство использовать умею...
Но все эти проблемы заставлюят извращаться...
Лучше оставлю как есть, и буду вместо пропертисов, юзать те ф-ции которые они вызывают. А в будушем уже думать и знать, что копировать проперитсы вектор не умеет.
Я могу извращаться по разному.
Но вот в чем хранить данные, вот эт проблема.
Сейчас идея только одна.
Вектор использовать для хранения указателей TCol, сам же TCol хранить в куче.
Банальный TStringList будет тебе опорой
Очень прошу не предлагать в качестве решения проблем, ВКЛ. Ну не переношу я его.. Использую, только из-за того что больше нечего.
пытался, а где и как хранить данные? В чем?
Юзать new?
еще раз, - исходники TStringGrid открывал? Св-во Objects...
Мне нужен лист моего TCol а не Стирнга.
И TStringList, категарически использовать не буду.
Первое он очень тяжелый и имеет много лишнего.
не ко мне, skip...
Второе я стараюсь максимум уходить от ВКЛ.
гы-гы ... снимаю шляпу перед мастером
Индексированое свойство использовать умею...
Но все эти проблемы заставлюят извращаться...
уходить от VCL, работая на Билдере это извращение...
еще раз, - исходники TStringGrid открывал? Св-во Objects...
не ко мне, skip...
гы-гы ... снимаю шляпу перед мастером
уходить от VCL, работая на Билдере это извращение...
Не буду спорить. Дело вкуса.
ГИЗМО, к вам у меня большое уважание.
Просто не хочу полностью полагаться на среду разработки. Хотя с проперитсами я именно так и делаю...
Но всё же.
В дальнейшем планирую переходить на Вижуал. Поэтому и готовлю себя.
К гриду мои классы имеют лишь косвенно отношения...
Он не подходит.
У меня в самом базовом классе, моего TData Грида нет.
Грид лишь изредка используется чтобы отобразить данные.
В некоторых с лучаях Грида вообще может и не быть, а данныех в паямти храниться должны.
К гриду мои классы имеют лишь косвенно отношения...
Он не подходит.
У меня в самом базовом классе, моего TData Грида нет.
Грид лишь изредка используется чтобы отобразить данные.
В некоторых с лучаях Грида вообще может и не быть, а данныех в паямти храниться должны.
... посмотри как реализовано св-во Objects[][](Я тебе и не говорил грид использовать).
Ну или создай оболчку для TList проще, простого....
... посмотри как реализовано св-во Objects[][](Я тебе и не говорил грид использовать).
Ну или создай оболчку для TList проще, простого....
Аааааааааааааааааааа=)))
Хорошо спасибо. Ушел углубляться):D :)
Суть уловил.
Проблема топика не в том как этого можно добиться. Хрен с ним, у самого голова на плечах есть. Придумаю, если нужно.
Вопрос был можно ли или нет. Ответ нет. Вектор нах посылает пропертисы. Впринципе всё.
Очень часто случаеться что он гибнет.
Начал обращаться к нему через форму, пожалуйста выскачила ошибка
Что вот где-то сделать что-то не так. Причем ошибка не при компиляции, а во время выполнения программы.
Ошибка доступа к памяти....
Кароче ребят, вектор не для хранения тяжелых объектов.
Ты сможешь назвать конкретную строку в стандарте, где это сказано? :D
Если нет, то нет смысла что-либо постулировать.
Ты сможешь назвать конкретную строку в стандарте, где это сказано? :D
Если нет, то нет смысла что-либо постулировать.
Разработчики нагло скрыли от нас этот ужастный факт)))
Нет, просто хз.
Когда я вызываю методы объектов которые сохранены в векторе то все ок.
Но тут указатель на объект который хранит вектор
попал в еще один мой модуль. И бац, ошибка. И самое главное не понятно из-за чего. В одном модуле все ок. в другом выкрывает код вектора и ругаеться...
[size=3]Кароче теперь кроме как указателей я ему не доверю хранить, он меня подводит в самый ответсвенный момент. [/size]
Все дело в кривости рук и незнания матчасти, а не в векторе.
У меня в одном месте он работает в другом нет.
....
Конечно кивости рук. Я другого ответа не ожидал...
:(
Бесит то что даже не знаешь с какой стороны, подойти к решению проблемы...
ОШИБКА в несанкционированном обращении к памяти...:(
У меня в одном месте он работает в другом нет.
....
Конечно кивости рук. Я другого ответа не ожидал...
:(
Бесит то что даже не знаешь с какой стороны, подойти к решению проблемы...
ОШИБКА в несанкционированном обращении к памяти...:(
Ну так приведи пример кода (только не весь), попробуем помочь.
Ну так приведи пример кода (только не весь), попробуем помочь.
Весь код приводит конешно не стану, он на несколько страниц.
Всё, спасибо, за отклик.
Но я победил)))), я дурак.
Я уже и забыл как работает мой старый модуль, который я писал пару месяцев назад.
Но пользуюсь им по сей день. И не помнил уже где в нем что как просиходит. Действительно, я пытался прочитать данные в векторе, которых там еще не было:(
У меня эти данные заполнялись несколько позже оказывается чем я ожидал. Сейчас по ступенькам поднялся вверх и все увидел)
если ты держишь в контейнере объекты, то работать с указателями на них следует крайне осторожно, а лучше вообще не ссылаться по указателю.
Замечание на будущее:
если ты держишь в контейнере объекты, то работать с указателями на них следует крайне осторожно, а лучше вообще не ссылаться по указателю.
Спасибо.
Но проблема была вот в чем...
Была такая ф-ция к еще не заполненому вектору.
unsigned int i;
for (i=0; i<Col.size(); i++)
if (Col.Field == Str)
break;
return Col;
}
Ф-ция соствлено некорректно без проверки на ошибки и возварщения кода ошибки. Понел, знаю.