LINUX.ORG.RU

доступ к шаблонным объектам фабрики???


0

0

Доброго времени суток Вам.

Создал базовый класс с методом-фабрикой. От базового класса произвел template потомка. Создал template объекты с помощью метода-фабрики. Все как по теории и все работает. Дальше проблема.

Не могу получить доступ к полям шаблонного потомка объектами созданными с помощью фабрики. В данном конкретном случае не могу получить доступ к элементам 3Д массива через перегруженную операцию ().

Помогите пожалуйста. Бьюсь над проблемой уже неделю. Нашел фабрику и вот опять затык.

Спасибо

#include <stdlib.h>

#include "misc.h"

// 3d array element type for factory

#define ET_UCHAR 2

#define ET_SHORT 4

#define ET_INT 8

#define ET_FLOAT 16

#define ET_DOUBLE 64

// base class for FACTORY

class BaseAr3d

{

public:

virtual void Allocate() = 0;

virtual void Init(int x, int y, int z) = 0;

virtual ~BaseAr3d() {};

static BaseAr3d* factory(int type);

};

template<class T> class array3d : public BaseAr3d

{

private:

int sizex, sizey, sizez;

T ***data;

void Allocate();

public:

array3d(){};

~array3d(){};

// creates allocated x*y*z array

void Init(int x, int y, int z){ sizex=x; sizey=y; sizez=z; Allocate(); };

T operator()(int x, int y, int z){ return(data[x][y][z]); }; // !!! instead of [][][]

};

BaseAr3d* BaseAr3d::factory(int type)

{

if(type == ET_UCHAR) return new array3d<unsigned char>;

if(type == ET_SHORT) return new array3d<short>;

if(type == ET_INT) return new array3d<int>;

if(type == ET_FLOAT) return new array3d<float>;

if(type == ET_DOUBLE) return new array3d<double>;

};

anonymous

А что выдает? Segmentation fault?

Может быть ты неверно выделяешь память под 3д массив?

zhuk
()
Ответ на: комментарий от zhuk

Без фабрики для одного какого-то типа данных (int etc) все работет - выделяется память, идет обработка, освобождается память. Но данные картинки могут быть 6 разных типов (от char до double). Вот я и пытаюсь написать обин класс, который бы работал со всеми типами. Вроде как шаблоны подходят для этого. Пришлось фабрику сделать. Объекты могу создать разного типа, соответственно заполнить их данными разного типа, но когда начинается обработка данных методами каких-то внешних данных (например, картинки собираются в последовательности, последовательности с разными характеристиками и значит технологиями обработки и т.п.) я не могу получить доступ к данным и именно потому что они в шаблонном объекте.

Вот как. Тут видимо нужна какая-то яркая идея как это разрешить. Вероятно уже кто-то решал такое или видел где решено?

anonymous
()
Ответ на: комментарий от anonymous

комментарий

Комментарий к предыдущему посту: В моем случае картинка трехмерная. Потому и речь о трехмерном массиве как примитиве.

anonymous
()
Ответ на: комментарий от anonymous

>я не могу получить доступ к данным и именно потому что они в шаблонном объекте.

Компилятор всегда выполняет инстанцинацию шаблона перед использованием. Шаблоны являются таковыми только во время компиляции, во время исполнения программы это обычные классы.

Дай код функции Allocate(). Может ты действительно неверно выделяешь память?

zhuk
()
Ответ на: комментарий от zhuk

Вот код Allocate(). Но никаких ошибок при работе с памятью не было. Размещал большие объемы, обрабатывал, освобождал. Все это работало когда с одним типом работал.

//========= array3d members ========== template<class T> void array3d<T>::Allocate() { data=(T ***) new (T *)[sizez]; for(int k=0; k<sizez; k++) data[k]=(T **) new (T*)[sizey];

for(int k=0; k<sizez; k++) for(int i=0; i<sizey; i++) data[k][i]=new T[sizex];

};

anonymous
()
Ответ на: комментарий от anonymous

Вот код Allocate(). Но никаких ошибок при работе с памятью не было. Размещал большие объемы, обрабатывал, освобождал. Все это работало когда с одним типом работал.

//========= array3d members ==========

template<class T> void array3d<T>::Allocate()

{

data=(T ***) new (T *)[sizez];

for(int k=0; k<sizez; k++)

data[k]=(T **) new (T*)[sizey];

for(int k=0; k<sizez; k++)

for(int i=0; i<sizey; i++)

data[k][i]=new T[sizex];

};

Извините за изврат в предыдущем посте

anonymous
()

Вам бы почитать литературу про проектирование. У вас возвращается указаетль на объект типа BaseAr3d, у которго нет "перегруженной операции ()".

sergio_nsk
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.