Re[2]: Проблема с СArray (при попытке создать массив массив
От: WolfHound  
Дата: 26.09.03 04:51
Оценка: +1
Здравствуйте, comer, Вы писали:

C>Что посоветовать, не знаю, так как MS классы типа CArray не использую. Если не нужна такая жесткая привязка к этим классам, то может просто попробовать STL.


Я бы сказал что ATL контейнеры лучше вобще не использовать. Корявость страшная.
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: Проблема с СArray (при попытке создать массив массив
От: Andrew S Россия http://alchemy-lab.com
Дата: 26.09.03 09:08
Оценка: :)
Вообще то это больше похоже на MFC контейнер. Ну да не суть важно. На самом деле в некоторых случаях их вполне хватает. А STL тащит за собой msvcp60.dll, что очень неприятно.

WH>>Я бы сказал что ATL контейнеры лучше вобще не использовать. Корявость страшная.


ME>Согласен. Ацтой редкостный (это касается и всех плюсовых библиотек от microsoft).
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Проблема с СArray (при попытке создать массив массивов
От: Kseniya Украина  
Дата: 25.09.03 22:42
Оценка:
Привет всем.

Помогите разобраться с такой проблемой (Microsoft Visual С++.Net, 7.0).


Есть два типа

typedef CArray<int,int> LabLine;
typedef CArray<LabLine,LabLine&> LabTable;

Далее в функции объявлены:

LabLine lLine;
LabTable lTable;

На строчке:

lTable.Add(lLine);

вылетает ошибка:

e:\Microsoft Visual Studio .NET\Vc7\atlmfc\include\afxtempl.h(500): error C2582: 'operator =' function is unavailable in 'CArray<TYPE,ARG_TYPE>'
with
[
TYPE=int,
ARG_TYPE=int
]

которая ссылается на последнюю строчку в приведенной ниже функции из файла afxtempl.h

void CArray<TYPE, ARG_TYPE>::SetAtGrow(INT_PTR nIndex, ARG_TYPE newElement)
{
ASSERT_VALID(this);
ASSERT(nIndex >= 0);

if (nIndex >= m_nSize)
SetSize(nIndex+1, -1);
m_pData[nIndex] = newElement;
}


В чем проблема и как ее можно исправить?

Заранее большое спасибо.

Ксения.
Re: Проблема с СArray (при попытке создать массив массивов
От: comer США http://getboost.codeplex.com/
Дата: 26.09.03 00:39
Оценка:
Здравствуйте, Kseniya, Вы писали:


K>Есть два типа


K>typedef CArray<int,int> LabLine;
K>typedef CArray<LabLine,LabLine&> LabTable;


K>Далее в функции объявлены:


K>LabLine lLine;
K>LabTable lTable;


K>На строчке:


K>lTable.Add(lLine);


K>вылетает ошибка:


K>e:\Microsoft Visual Studio .NET\Vc7\atlmfc\include\afxtempl.h(500): error C2582: 'operator =' function is unavailable in 'CArray<TYPE,ARG_TYPE>'
K>        with
K>        [
K>            TYPE=int,
K>            ARG_TYPE=int
K>        ]


...

K>В чем проблема и как ее можно исправить?


Проблема в том что CArray<...> наследуеться от CObject, в котором запрещен оператор '=' и конструктор копирования. Соответственно и CArray<...> их тоже не имеет. Проблема проявляеться даже на более простом примере:

typedef CArray<int, int> LabLine;

int main()
{
    LabLine lLine;
    LabLine lLine0;
    lLine = lLine0;
    return 0;
}


Что посоветовать, не знаю, так как MS классы типа CArray не использую. Если не нужна такая жесткая привязка к этим классам, то может просто попробовать STL.

#include <vector>

typedef std::vector<int> LabLine;
typedef std::vector<LabLine> LabTable;

int main()
{
    LabLine lLine;
    LabTable lTable;
    lTable.push_back(lLine);
    return 0;
}


Если нужна привязка, то может так (может нечто подобное есть в MS уже готовое, не знаю):

template<class T, class A = const T &>
class YourCArray: public CArray<T, A>
{
public:
    YourCArray() {}
    YourCArray(const YourCArray<T, A> &x) { Copy(x); }
    YourCArray &operator=(const YourCArray<T, A> &x) { Copy(x); return *this; }
};

typedef YourCArray<int, int> LabLine;
typedef YourCArray<LabLine, LabLine &> LabTable;

int main()
{
    LabLine lLine;
    LabTable lTable;
    lTable.Add(lLine);
    return 0;
}
getboost.codeplex.com
citylizard.codeplex.com
Re: Проблема с СArray (при попытке создать массив массивов
От: Bell Россия  
Дата: 26.09.03 06:30
Оценка:
Здравствуйте, Kseniya, Вы писали:

Проблема в том, что CArray не имеет оператора присваивания.
ИМХО наиболее простой выход — использовать std::vector:

typedef std::vector<int> LabLine;
typedef std::vector<LabLine> LabTable;

LabLine lLine;
LabTable lTable;

lTable.push_back(lLine);
lTable[0].push_back(1);


Если же по каким-то причинам нуэно использовать именно CArray, то можно поступить так:
реализовать proxy-класс, который бы содержал объект типа CArray и определял бы operator =, operator[] и конструктор копии, и использовать этот proxy-класс в качестве элементов CArray "верхнего уровня" .

А еще можно воспользоваться поиском про "Многомерные массивы" — эта тема обсуждалась несколько раз.
Любите книгу — источник знаний (с) М.Горький
Re[3]: Проблема с СArray (при попытке создать массив массив
От: MaximE Великобритания  
Дата: 26.09.03 07:50
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Я бы сказал что ATL контейнеры лучше вобще не использовать. Корявость страшная.


Согласен. Ацтой редкостный (это касается и всех плюсовых библиотек от microsoft).
Re[5]: Проблема с СArray (при попытке создать массив массив
От: MaximE Великобритания  
Дата: 26.09.03 09:20
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>Вообще то это больше похоже на MFC контейнер. Ну да не суть важно. На самом деле в некоторых случаях их вполне хватает. А STL тащит за собой msvcp60.dll, что очень неприятно.


Это потоки тянут. Контейнеры и алгоритмы все в хедерых.
Re[2]: Проблема с СArray (при попытке создать массив массив
От: m.a.g. Мальта http://dottedmag.net/
Дата: 26.09.03 10:06
Оценка:
Здравствуйте, Bell, Вы писали:

B>Если же по каким-то причинам нуэно использовать именно CArray, то можно поступить так:

B>реализовать proxy-класс, который бы содержал объект типа CArray и определял бы operator =, operator[] и конструктор копии, и использовать этот proxy-класс в качестве элементов CArray "верхнего уровня" .

А boost::shared_ptr не подойдет в качестве такого прокси?
... << RSDN@Home 1.1 beta 2 >>
Re[5]: Проблема с СArray (при попытке создать массив массив
От: WolfHound  
Дата: 26.09.03 10:36
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>Вообще то это больше похоже на MFC контейнер. Ну да не суть важно. На самом деле в некоторых случаях их вполне хватает. А STL тащит за собой msvcp60.dll, что очень неприятно.

А можно узнать в каком месте стандарта это написано?
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: Спасибо
От: Kseniya Украина  
Дата: 26.09.03 10:40
Оценка:
Спасибо всем, кто ответил. Попробую сделать через векторы.
Re[6]: Проблема с СArray (при попытке создать массив массив
От: Аноним  
Дата: 26.09.03 10:42
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>А можно узнать в каком месте стандарта это написано?


Причем здесь стандарт?
Re[7]: Проблема с СArray (при попытке создать массив массив
От: WolfHound  
Дата: 26.09.03 10:58
Оценка:
Здравствуйте, Аноним, Вы писали:

WH>>А можно узнать в каком месте стандарта это написано?

А>Причем здесь стандарт?
А при том что STL описана в стандарте.
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[8]: Проблема с СArray (при попытке создать массив массив
От: Аноним  
Дата: 26.09.03 11:21
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>А при том что STL описана в стандарте.


Какое отношение это утверждение имеет к тому, что "...STL тащит за собой msvcp60.dll, что очень неприятно"?
Re[3]: Проблема с СArray (при попытке создать массив массив
От: Bell Россия  
Дата: 26.09.03 12:24
Оценка:
Здравствуйте, m.a.g., Вы писали:

MAG>А boost::shared_ptr не подойдет в качестве такого прокси?


Ну, если запись вроде такой
(*lTable[i])[j] = 1;

тебя не смушает, то тогда конечно.
Любите книгу — источник знаний (с) М.Горький
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.