Приведение из базового класса в информацию о свойствах производного класса теряется [дубликат]C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Приведение из базового класса в информацию о свойствах производного класса теряется [дубликат]

Сообщение Anonymous »


Я не уверен, что происходит, но, глядя на мои отладочные данные, кажется, что я теряю данные, которые храню в vector, когда иду их получить.
>
Вот где запускается мое приложение, и вот обзор блока:
[*]Получите первое значение из командной строки (это полный путь к файлу jpg). [*]Получите второе значение, чтобы сохранить новый файл на диск. [*]Получите загрузчик (png или jpeg) и загрузите файл в вектор, содержащий объекты Color. [*]Сохраните файл на диск.
int main(int argc, char* argv[]) { строка в (argv[1]); // Входной файл строка out(argv[2]); // Выходной файл // Получает загрузчик для загрузки файлов jpg или png (просто фабричная функция) shared_ptr loader = Loader::get(in); // Запускаем фабрику автоматическое изображение = загрузчик->загрузка(); // Сохранение изображения вызывает `image->save()` по параметру 2 Загрузчик::set(out, image); } В загрузчике, который загружает (в данном случае jpg), мы делаем следующее:
[*]Настройте libjpeg со всеми его настройками и прочитайте их во входном файле. [*]Создайте новое изображение, в котором будут храниться данные, которые будут доступны всему приложению. [*]перебрать данные изображения и извлечь значения r, g, b и создать цветовой объект. [*]приведите возвращенный Color к RGBColor (поскольку class RGBColor : public Color). [*]Добавьте цвет к изображению.
// Получаем все цвета изображения shared_ptr Jpeg::load() { /* настройка libjpeg */ shared_ptr image = make_shared(this->path, width, height); пока(...) { // Получаем каждый компонент цвета (`r, g, b` — значения `int`) shared_ptr color = Color::rgb(r, g, b, 255); auto rgb = Dynamic_pointer_cast(цвет); изображение->addColor(rgb); } } Класс Color — это просто класс (на данный момент), который хранит информацию. В настоящее время он не имеет никаких функций (но может быть в будущем), поэтому я не создавал структуру или что-то в этом роде.

// Color.cpp shared_ptr Color::rgb(int r, int g, int b, int a) { return make_shared(r, g, b, a); } // RGBColor.h класс RGBColor: публичный цвет { публика: интервал р; интервал г; интервал б; RGBColor(int r, int g, int b, int a = 255) { это-> г = г; это->г = г; это->б = б; это->а = а; } }; Вот класс Image, в котором хранится информация о цвете

Изображение класса { публика: данные вектора; void addColor(shared_ptr color) { это->data.push_back(*цвет); } // Возвращаемый объект затем преобразуется в RGBColor (см. ниже). shared_ptr getColor(int index) { return make_shared(this->data[index]); } }; Здесь я получаю ошибку выполнения Ошибка сегментации для этой строки: data = rgb->r;.
[*]И снова настройте libjpeg. [*]Инициализировать массив, чтобы извлечь данные из объекта и вернуть их в int[]. [*]Получить цвет по указанному индексу [*]Преобразовать Color в RGBColor
bool Jpeg::save(string path,shared_ptr image) { /* настройка libjpeg */ данные беззнакового символа [изображение-> ширина * 3]; пока (...) { автоматический цвет = изображение->getColor(i); auto rgb = Dynamic_pointer_cast(цвет); данные [я] = RGB-> г; // получаем другие цвета jpeg_write_scanlines(&cinfo, (JSAMPARRAY)&data, 1); } } Почему, когда я выполняю преобразование Color в RGBColor, информация о цвете исчезает, как показано на изображениях ниже:


Изображение

Изображение

Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»