Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.10.2011, 20:01   #1
Variag
 
Регистрация: 05.10.2011
Сообщений: 7
По умолчанию чуть-чуть о классах

Здравствуйте.
Допустим, есть конструкция вроде следующей (сразу извиняюсь за возможные синтаксические ошибки, так как пишу прямо здесь - да и не в них соль):

class base
{
int* massiv;
int var1, var2;
public:
//здесь описываются конструкторы и методы доступа к переменным
};

class A : public base
{
int varA;
public:
//опять же конструкторы, методы доступа и прочие функции
};

class B : public base
{
int varB;
public:
///////////////////////
};

int main()
{
base* X = new A;
base* Y = new B;'
????????????????
return 0;
}

А вот на месте вопросов я хотел бы произвести копирование переменных, которые относятся к базовому классу, то есть var1, var2 и указатель massiv, из X в Y.
Понятно, что можно при помощи методов доступа все их последовательно скопировать, но хотелось бы узнать, нет ли метода пооригинальнее и покрасивее.
Заранее спасибо.
Variag вне форума Ответить с цитированием
Старый 14.10.2011, 20:25   #2
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Через дружественную функцию можно получать доступ к закрытым полям класса.
An1ka вне форума Ответить с цитированием
Старый 14.10.2011, 20:31   #3
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Так как ваши указатели X и Y имеют статический тип base, то вы просто можете присвоить один объект другому, то есть

Код:
*X = *Y;
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 14.10.2011, 21:03   #4
Variag
 
Регистрация: 05.10.2011
Сообщений: 7
По умолчанию

спасибо, а то я пытался сделать
X = Y
Все компилировалось, но при выполнении ошибка.
Потом пытлся извращаться с использованием конструктора-копировщика. Громоздко получилось.
Variag вне форума Ответить с цитированием
Старый 14.10.2011, 21:31   #5
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от Variag Посмотреть сообщение
спасибо, а то я пытался сделать
X = Y
Все компилировалось, но при выполнении ошибка.
Потом пытлся извращаться с использованием конструктора-копировщика. Громоздко получилось.
Только имейте в виду, что у вас скопируется только значение указателя, а не сами объекты, лежащие в памяти по значению адреса, хранящемся в этом указателе.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 15.10.2011, 16:45   #6
Variag
 
Регистрация: 05.10.2011
Сообщений: 7
По умолчанию

Цитата:
Только имейте в виду, что у вас скопируется только значение указателя, а не сами объекты, лежащие в памяти по значению адреса, хранящемся в этом указателе.
как раз то что надо. Еще раз спасибо.
Variag вне форума Ответить с цитированием
Старый 15.10.2011, 20:07   #7
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от Variag Посмотреть сообщение
как раз то что надо. Еще раз спасибо.
Вам не обязательно через указатели на базовый класс делать присваивание одного объекта другому. Можно это делать и используя сами объекты.

Например,

Код:
A a;
B b;

a.base::operator =( b );
Я набрал этот код, не проверяя, но тем не менее в принципе он должен работать.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 17.10.2011, 15:00   #8
Variag
 
Регистрация: 05.10.2011
Сообщений: 7
По умолчанию

я на своем пути изучения С++ и одновременного написания программы столкнулся с еще одной проблемой:
Если вернуться чуть наверх к строке
base* X = new A;
как мне получить доступ к методам класса А через созданный указатель X?
Чисто виртуальные функции использовать не хочу, так как от класса base наследуется еще и класс B, обладающий функциями другой направленности. Соответственно базовый класс определениями чисто виртуальных функций перегружать не хочу, да и неизвестно как определять такие функции предназначенные для класса A в классе B.
Что делать?
Variag вне форума Ответить с цитированием
Старый 17.10.2011, 15:28   #9
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Цитата:
Сообщение от Variag Посмотреть сообщение
base* X = new A;
как мне получить доступ к методам класса А через созданный указатель X?
Без виртуальных функций никак. Ну или reinterpret_cast использовать, а для dynamic_cast нужна хотя бы одна виртуальная функция всё равно.

Цитата:
Сообщение от Variag Посмотреть сообщение
Чисто виртуальные функции использовать не хочу, так как от класса base наследуется еще и класс B, обладающий функциями другой направленности.
При использовании виртуальных функций это никаких проблем не вызовет. Функции будут вызываться по фактическому типу объекта, а не по типу указателя.
An1ka вне форума Ответить с цитированием
Старый 17.10.2011, 16:24   #10
Variag
 
Регистрация: 05.10.2011
Сообщений: 7
По умолчанию

Цитата:
При использовании виртуальных функций это никаких проблем не вызовет. Функции будут вызываться по фактическому типу объекта, а не по типу указателя.
Да это то понятно. Но их даже разное число в разных классах. Ну, например, классу A нужно уметь читать данные из порта, соответственно нужна функция вида:
void ReadPort(int port)
а классу B - выводить в файл, соответственно нужна функция
void WriteFile(const char* filename)
Дилемма...
Variag вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно дописать программу, примерно 90% сделано, осталось чуть чуть Xerxes Фриланс 2 31.01.2011 23:27
График функции на паскале, чуть-чуть поправить momentow Помощь студентам 1 28.12.2010 01:28
программа часы,надо чуть-чуть переделать RadioDream Помощь студентам 1 21.10.2010 19:29
нашел поиском нужный макрос, чуть чуть бы доработать zander Microsoft Office Excel 3 30.09.2009 12:19