Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> НЕиспольование ссылок в конструкторе, возможно "мутно" сформулировано.... 
:(
    Опции темы
kurtis
Дата 23.7.2008, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 10.8.2007

Репутация: нет
Всего: нет



Есть следующий код
Код

#include <iostream>
using namespace std;    

    int yaNULL;//как избавится от этой переменной???
    
    int gYA1;
    int gYA2;
    int gYA3;
    int gYA4;    

    class ProbaClass
    {
        private:
            int        Status;
            int     & cYA1;
            int     & cYA2;
            int     & cYA3;
            int     & cYA4;
            void StartUp() 
            {
                Status = 0;
            }
        public:
            void WorkClass()
            {
                switch (Status) //Значение Status задается в конструкторе
                {
                    case 0x01:// Если был использован конструктор 1
                        cYA1 = 100;
                        break;
                    case 0x02:// Если был использован конструктор 2
                        cYA1 = 100;
                        cYA2 = 100;                        
                        break;
                    // еще 2 варианта для cYA3 и cYA4
                    default:
                        std::cout << "Error" << std::endl;
                        break;
                }
            }
//Конструктор 1
            ProbaClass    ( 
                            int& _mYA1
                        )
                        : cYA1    ( _mYA1    ),
                        cYA2    ( yaNULL ),
                        cYA3    ( yaNULL ),
                        cYA4    ( yaNULL )
            {
                StartUp();
                Status = 0x01;
            };
//Конструктор 2
            ProbaClass    (
                            int& _mYA1, 
                            int& _mYA2
                        )
                        : cYA1  ( _mYA1    ),
                        cYA2    ( _mYA2    ),
                        cYA3    ( yaNULL ),
                        cYA4    ( yaNULL )
            {
                StartUp();
                Status = 0x02;
            };
            // и т.д. по аналогии
//Конструктор 3
//Конструктор 4
    };

//ProbaClass    MyClass(gYA1);    
ProbaClass    MyClass(gYA1, gYA2);
//ProbaClass    MyClass(gYA1, gYA2, gYA3);
//ProbaClass    MyClass(gYA1, gYA2, gYA3, gYA4);    

int main()
{
    MyClass.WorkClass();
    
    std::cout << "YA1 " << gYA1 << std::endl;
    std::cout << "YA2 " << gYA2 << std::endl;
    std::cout << "YA3 " << gYA3 << std::endl;
    std::cout << "YA4 " << gYA4 << std::endl;
    
    return 0;
};


Есть 4 глобальных переменные, в классе могут использоваться от 1 до 4х переменных. Для этого я создаю 4 конструктора (перегрузка конструктора) для передачи в обьект разного количества параметров. Параметры передаются по ссылке. Собственно непонятность возникает из-за такого кода
Код

            ProbaClass    ( 
                            int& _mYA1
                        )
                        : cYA1    ( _mYA1    ),
                        cYA2    ( yaNULL ),
                        cYA3    ( yaNULL ),
                        cYA4    ( yaNULL )
            {
                StartUp();
                Status = 0x01;
            };

Это конструктор который передается в обьект 1 параметр, но т.к. я передаю параметры по ссылке, а ссылка обязательно должна куда-то ссылаться, мне приходится извращатся и писать cYA2    ( yaNULL ),, т.е. есть какая-то переменная yaNULL, которая болтается где-то за классом, и которая используется только для того чтоб на нее указывали не использующиеся ссылки. 
Можно ли как-то "сказать" ссылке, что она не используется, и что ей не обязательно куда-то указывать???Звучит нелепо, но по другому не могу сформулировать....Т.е. я хочу попытаться избежать использования переменной yaNULL. Делать через макросы как-то не красиво , а писать для каждого отдельного случая свой класс, как-то слишком сложно, т.к. класс достаточно большой, и если найдутся какие-то ошибки(а они обязательно найдутся=)), то потом их синхронно исправлять в 4-х классах одновременно будет очень сложно. 
Через указатель это решается без проблем, но в образовательных целях хочется именно сделать через ссылку....

Заранее Спасибо!=)
PM MAIL   Вверх
Annihilator
Дата 23.7.2008, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: 1
Всего: 3



Цитата(kurtis @  23.7.2008,  23:53 Найти цитируемый пост)
Можно ли как-то "сказать" ссылке, что она не используется, и что ей не обязательно куда-то указывать???

Насколько помню это невозможно.
Ты, кажется уже создавал похожую тему, или я что-то не понимаю.. сформулируй четче.


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
mes
Дата 23.7.2008, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250




Цитата(kurtis @  23.7.2008,  19:53 Найти цитируемый пост)
ссылка обязательно должна куда-то ссылаться, мне приходится извращатся и писать cYA2    ( yaNULL ),, 

если ссылка может быть нулем - то вместо ссылки нужно использовать указатель..

Цитата(kurtis @  23.7.2008,  19:53 Найти цитируемый пост)
Т.е. я хочу попытаться избежать использования переменной yaNULL. Делать через макросы как-то не красиво , а писать для каждого отдельного случая свой класс, как-то слишком сложно, т.к. класс достаточно большой, и если найдутся какие-то ошибки(а они обязательно найдутся=)), то потом их синхронно исправлять в 4-х классах одновременно будет очень сложно

Помойму надо не избегать переменной yaNULL, а пересмотреть весь Ваш код.. Мне кажется Вы пошли не тем путем для решения своей задачи.
Не могли бы Вы озвучить исходное задание ? тогда будет понятно отчего плясать ...





--------------------
PM MAIL WWW   Вверх
Torsten
Дата 23.7.2008, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 10.6.2008
Где: Pskov

Репутация: нет
Всего: 7



Цитата(kurtis @  23.7.2008,  19:53 Найти цитируемый пост)
Можно ли как-то "сказать" ссылке, что она не используется, и что ей не обязательно куда-то указывать???

Если параметр ссылки может отсуствовать, то это не ссылка, это указатель.
--------------------
We have no begining, we have no end. We are infinite.
PM MAIL   Вверх
xvr
Дата 24.7.2008, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(kurtis @ 23.7.2008,  19:53)
Есть следующий код
Код

#include <iostream>
using namespace std;    

    int yaNULL;//как избавится от этой переменной???
    
    int gYA1;
    int gYA2;
    int gYA3;
    int gYA4;    

    class ProbaClass
    {
        private:
            int        Status;
            int     & cYA1;
            int     & cYA2;
            int     & cYA3;
            int     & cYA4;
            void StartUp() 
            {
                Status = 0;
            }
        public:
            void WorkClass()
            {
                switch (Status) //Значение Status задается в конструкторе
                {
                    case 0x01:// Если был использован конструктор 1
                        cYA1 = 100;
                        break;
                    case 0x02:// Если был использован конструктор 2
                        cYA1 = 100;
                        cYA2 = 100;                        
                        break;
                    // еще 2 варианта для cYA3 и cYA4
                    default:
                        std::cout << "Error" << std::endl;
                        break;
                }
            }
//Конструктор 1
            ProbaClass    ( 
                            int& _mYA1
                        )
                        : cYA1    ( _mYA1    ),
                        cYA2    ( yaNULL ),
                        cYA3    ( yaNULL ),
                        cYA4    ( yaNULL )
            {
                StartUp();
                Status = 0x01;
            };
//Конструктор 2
            ProbaClass    (
                            int& _mYA1, 
                            int& _mYA2
                        )
                        : cYA1  ( _mYA1    ),
                        cYA2    ( _mYA2    ),
                        cYA3    ( yaNULL ),
                        cYA4    ( yaNULL )
            {
                StartUp();
                Status = 0x02;
            };
            // и т.д. по аналогии
//Конструктор 3
//Конструктор 4
    };

//ProbaClass    MyClass(gYA1);    
ProbaClass    MyClass(gYA1, gYA2);
//ProbaClass    MyClass(gYA1, gYA2, gYA3);
//ProbaClass    MyClass(gYA1, gYA2, gYA3, gYA4);    

int main()
{
    MyClass.WorkClass();
    
    std::cout << "YA1 " << gYA1 << std::endl;
    std::cout << "YA2 " << gYA2 << std::endl;
    std::cout << "YA3 " << gYA3 << std::endl;
    std::cout << "YA4 " << gYA4 << std::endl;
    
    return 0;
};


Есть 4 глобальных переменные, в классе могут использоваться от 1 до 4х переменных. Для этого я создаю 4 конструктора (перегрузка конструктора) для передачи в обьект разного количества параметров. Параметры передаются по ссылке. Собственно непонятность возникает из-за такого кода
Код

            ProbaClass    ( 
                            int& _mYA1
                        )
                        : cYA1    ( _mYA1    ),
                        cYA2    ( yaNULL ),
                        cYA3    ( yaNULL ),
                        cYA4    ( yaNULL )
            {
                StartUp();
                Status = 0x01;
            };

Это конструктор который передается в обьект 1 параметр, но т.к. я передаю параметры по ссылке, а ссылка обязательно должна куда-то ссылаться, мне приходится извращатся и писать cYA2    ( yaNULL ),, т.е. есть какая-то переменная yaNULL, которая болтается где-то за классом, и которая используется только для того чтоб на нее указывали не использующиеся ссылки. 
Можно ли как-то "сказать" ссылке, что она не используется, и что ей не обязательно куда-то указывать???Звучит нелепо, но по другому не могу сформулировать....Т.е. я хочу попытаться избежать использования переменной yaNULL. 

Код

            ProbaClass    ( 
                            int& _mYA1
                        )
                        : cYA1    ( _mYA1    ),
                        cYA2    ( *(int*)1 ),
                        cYA3    ( *(int*)1 ),
                        cYA4    ( *(int*)1 )
Хотя это и грязный хак  smile 
PM MAIL   Вверх
kurtis
Дата 24.7.2008, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 10.8.2007

Репутация: нет
Всего: нет



Все спасибо за советы, видимо буду делать через указатель....
PM MAIL   Вверх
mes
Дата 24.7.2008, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(xvr @  24.7.2008,  11:26 Найти цитируемый пост)
Хотя это и грязный хак    

 "грязный" - это еще мягко сказанно !  smile 
Искрене надеюсь, что никто не воспользуется этим советом ... smile 


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.2467 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.