Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > С/С++
Перезагрузить страницу Прегрузка [], виртуальные функции, наследование
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Lammeruga Lammeruga вне форума
Новичок
 
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 22.05.2006
По умолчанию Прегрузка [], виртуальные функции, наследование - 22.05.2006, 23:27

Проблема в следующем:
Нужно создать иерархию классов, каждый класс представляет из себя динамический массив, только у них должны быть разные типы переменных (char, float, int) Базовый класс - массив char. Мне нужно перегрузить [] так, чтобы в наследниках и в базовом классе функция перегрузки возвращала нужный тип переменной. С помощью виртуал, так как это сделано у меня, не получается, тк возникает неоднозначность и выскакивает
error C2555: 'B::[]' : overriding virtual function differs from 'A::[]' only by return type or calling convention
see declaration of 'A'

Возможно ли хоть каким-нибудь способом реализовать такую штуку?
Может есть какой-то хитрый прием?
template не предлагать.....нельзя.....

Код:
#include "stdafx.h"
#include "iostream.h"

class A
{
public:
    char* r;      //у-тель на массив
    int dim;      //размерность
    int type;     //тип переменной, т.е. размер ее в байтах

    A(int,int);       //конструктор int-размерность
    ~A();         //деструктор

    virtual char& operator [] (int);
};

A::A(int d, int t)       //конструктор
{
    dim=d;
    type=t;
    r=new char[dim*dim*sizeof(int)];
    int q;
    for (q=0;q<d*d*t;q+=type)
    {
  *((int*)(r+q))=q;
    };
};

A::~A()           //деструктор
{
    delete r;
};

char& A::operator [] (int m)               //Перегрузка индексирования
{
    return *(r+m*sizeof(char));
};

class B:public A
{
public:
    B(int);
    int& operator [] (int);
};

B::B(int n):A(n,sizeof(int)){};         

int& B::operator [] (int m)
{
    return *((int*)(r+m*sizeof(int)));
};

void main()
{
    A p(3,1);
    int i;
    p[0]=5;
    for (i=0;i<p.dim*p.dim;i++)
    {
  cout<<(p[i])<<" ";
    };
};
Ответить с цитированием
  (#2 (permalink)) Старый
grustnoe grustnoe вне форума
Member
 
Сообщений: 496
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 08.11.2003
По умолчанию 23.05.2006, 06:56

Как-то плохо твоя задача ложится на наследование. Посмотри лучше в сторону шаблонов.

P.S. int не порожден от char - поэтому ковариантной функцией тут не воспользуешься
Ответить с цитированием
  (#3 (permalink)) Старый
Yaroslav Yaroslav вне форума
Member
 
Сообщений: 166
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.10.2004
По умолчанию Прегрузка [] - 23.05.2006, 08:04

А зачем вобше использовать приобразование в int используй везде char, а при использовании массива умножай на sizeof(int):
Код:
 
  for (i=0;i<p.dim*p.dim;i++)
   cout<<(p[i*sizeof(int)])<<" ";
Просто учитавай размерности при чтении/записи в массив либо char либо int.
Ответить с цитированием
  (#4 (permalink)) Старый
Lammeruga Lammeruga вне форума
Новичок
 
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 22.05.2006
По умолчанию Re: Прегрузка [] - 23.05.2006, 09:54

Цитата:
Originally posted by Yaroslav
[b]Просто учитавай размерности при чтении/записи в массив либо char либо int.
Не получится, он тогда будет выводить мне значения ячейки в виде char,только не каждого подряд, а чере n раз, здесь нужно преобразование указателя.
Ответить с цитированием
  (#5 (permalink)) Старый
Yaroslav Yaroslav вне форума
Member
 
Сообщений: 166
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.10.2004
По умолчанию 23.05.2006, 12:44

Цитата:
Не получится, он тогда будет выводить мне значения ячейки в виде char,только не каждого подряд, а чере n раз, здесь нужно преобразование указателя.
Если нужно просто передавать значения между байтом и словом то
Код:
 char a = 5;
 short b = a;
А если нужно перемешатся по массиву и считывать разные данные то нужно вводить указатель. которы будет перемешатся по массиву и считыват.
Ответить с цитированием
Ads.
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Множественное наследование и виртуальные функции grasper С/С++ 20 26.10.2011 11:19
Виртуальные функции Наталья1204 C++ Builder 0 31.08.2011 14:48
Наследование и fk ykyk PostgreSQL 0 12.09.2007 11:25
Для чего нужны виртуальные функции sunrize С/С++ 8 02.11.2005 11:35
Виртуальные COM - порты в С++ blur Visual C++ 1 24.10.2005 03:13
Виртуальные функции в С++ как с ними работать SkySp С/С++ 4 10.06.2005 10:05
Написание кода ООП-виртуальные функции HELP era Вопросы начинающих программистов 1 10.06.2004 00:06
Перегрузка + виртуальные функции в Visual C++.NET Nica Visual C++ 5 14.05.2004 12:04
Виртуальные функции как с ними работать TNT С/С++ 2 08.04.2004 17:01
C++ виртуальные деструкторы и конструкторы Exhu С/С++ 3 30.03.2004 12:32
Посчитать виртуальные методы DaniX Delphi 0 15.03.2004 22:03
Чисто виртуальные функции const Mahler С/С++ 2 28.01.2004 15:42



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов