Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > передача приватных данных между классами


Автор: Mr_Nuke 17.5.2011, 17:51
Подскажите, хочу передать указатель in из класса file в класс A. 

Код

class file{    
    public:
        file();        
        ifstream &ReturnIn(){return (in1);}; //  Как вариант, пробовал и такой способ
    private:
        ifstream in1;        
};


class A{    
    public: 
        A();
        void SetIn(ifstream in){in1 = in;}  //  Вторая часть метода
    private:        
        ifstream in1;        
};


Пробовал объявить класс file дружественным к классу А и передать объект класса file в метод класса A в виде параметра. Может не правильно делал, но выдавал ошибку доступа. (Если так сделать нельзя, то вообще не понимаю, зачем нужна дружба)
Код

class file{
    friend A;
    public:
        file();
    private:
        ifstream in1;
        
};

class A{    
    public: 
        A(file);
    private:        
        ifstream in1;        
};

A::A(file F){in1 = F::in1;};

void main(){
              file F;
              A obj(F);
}


И последний способ, пытался вернуть ссылку на in и через главную программу передать значение в класс A. Надоело наугад ставить значки "*" и "&", поэтому обратился за помощью сюда!

 

Автор: Cheloveck 17.5.2011, 18:05
Код

class file{    
    public:
        file();        
        ifstream &ReturnIn(){return (in1);};
    private:
        ifstream in1;        
};
class A{    
    public: 
        A();
        void SetIn(ifstream & in){in1 = ∈}
    private:        
        ifstream * in1;        
};

Только возвращать не константную ссылку на приватный член - не хорошо. Подумай над задачей получше!

Автор: Mr_Nuke 17.5.2011, 18:28
Cheloveck, скорее, я просто не понимаю, как на практике применить * и &. 
Путем рандомного тыкания  у меня появилось 3 варианта, и в обоих ошибка доступа :(
Код

ifstream ReturnIn(){return (in1);};


Код

ifstream *ReturnIn(){return (&in1);};


Код

ifstream &ReturnIn(){return (*(&in1));};  //  Это вычитал из главы про константные ссылки :)

Автор: mes 17.5.2011, 19:43
Цитата(Mr_Nuke @  17.5.2011,  16:51 Найти цитируемый пост)
      A(file);
    private:        
        ifstream in1; 

A::in1 никакого отношения не имеет к file::in1

Автор: Mr_Nuke 17.5.2011, 19:47
mes, это я понимаю... только не пойму, где у меня показано обратное...

Автор: mes 17.5.2011, 20:49
Цитата(Mr_Nuke @  17.5.2011,  16:51 Найти цитируемый пост)
in1 = in;

istream`ы не копируются.. храните в ведомых объектах ссылку/указатель на поток

Добавлено через 54 секунды
Цитата(Mr_Nuke @  17.5.2011,  18:47 Найти цитируемый пост)
это я понимаю... только не пойму, где у меня показано обратное...

в первом блоке кода не было видно связи по их совместному использованию.. а во второй блок не посмотрел.. smile

Автор: Mr_Nuke 17.5.2011, 23:08
Цитата(mes @ 17.5.2011,  20:49)
istream`ы не копируются.. храните в ведомых объектах ссылку/указатель на поток

Ну с этим по понятней! Но все же интересует, как из одного класса изменять приватные данные другого!

Автор: mes 17.5.2011, 23:58
Цитата(Mr_Nuke @  17.5.2011,  22:08 Найти цитируемый пост)
 как из одного класса изменять приватные данные другого! 


также как и не приватные, если изменяет их друг или через публичные методы первого.. 

Автор: Mr_Nuke 18.5.2011, 00:23
эм. Может я тебя не совсем понял. посмотри мой первый пост, второй блок. Там я делал через друга, но появляется ошибка доступа 

Автор: mes 18.5.2011, 00:36
Цитата(Mr_Nuke @  17.5.2011,  23:23 Найти цитируемый пост)
 посмотри мой первый пост, второй блок.


вот тот же ужас, но в рабочем состоянии :
http://liveworkspace.org/code/cae083da92a724ac9d1370853a8e25b8

Автор: Mr_Nuke 18.5.2011, 07:18
mes,  хоть в написанном там коде для меня не все понятно, но результатом я доволен!! Спасибо)))))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)