Почему ссылки ломаются, когда делаются через указатели - PullRequest
0 голосов
/ 12 декабря 2011

у меня есть ссылочный конструктор по умолчанию для теста класса.

class test {
public:
    test(int &input1) : int_test(input1) {};
    ~test() {};

    int & int_test; 
}; 

Затем еще 2 класса, которые взаимодействуют с тестом следующим образом:

class notebook
{ 
public:
    notebook() {};
    ~notebook() {};

    int int_notebook;
};

class factory
{
public: 
    factory() {};
    ~factory(){};

    notebook *p_notebook;
};

If i intitalise test (t2)с целым числом, это работает как ожидалось:

int _tmain(int argc, _TCHAR* argv[]){

    int var=90;
    test t2(var);
    cout<<t2.int_test; // this gives 90
    var=30;
    cout<<t2.int_test; // this gives 30

Как только я инициализировал тестовый класс с указателем на член класса ноутбука через фабрику третьего класса:

factory f1;
notebook s1;
notebook s2;
s1.int_notebook=10;
s2.int_notebook=2;

int notebook::*p_notebook= &notebook::int_notebook;
f1.p_notebook=&s1;

test t1(((f1.p_notebook->*p_notebook)));
cout<<t1.int_test; // This gives  10

однако еслия меняю указатель f1.p_notebook на другой объект ноутбука s2;

f1.p_notebook=&s2;
cout<<t1.int_test; // This gives  10

ссылочный член a из t1 (t1.int_test) не отражает изменение указателя.кто-нибудь может объяснить мне, почему?или что я тут не так делаю.

Ответы [ 2 ]

0 голосов
/ 12 декабря 2011

Ваш класс test имеет ссылку на int. Он ничего не знает о том, какому объекту на самом деле принадлежит int Или как он изначально получил доступ к этому инт. Давайте разберем эту строку кода:

test t1(((f1.p_notebook->*p_notebook)));

Сначала это:

f1.p_notebook

С этой строки это указатель на s1. Теперь это:

f1.p_notebook->*p_notebook

Это член s1 int_notebook. Итак, с этим:

test t1(((f1.p_notebook->*p_notebook)));

Вы передаете элемент s1 int_notebook в конструктор теста. Так что теперь объект t1 имеет ссылку на элемент int_notebook s1. Его не волнуют непонятные уровни косвенности, которые вы использовали для получения этого члена. Он [t1] ничего не знает о f1 или f1.p_notebook. Поэтому, когда вы делаете это:

f1.p_notebook=&s2;

Это абсолютно не влияет на s1.int_notebook и, следовательно, не влияет на ссылочный член t1.

0 голосов
/ 12 декабря 2011
class CTester
{
    public:
        CTester(int &input1) : int_test(input1)
        {
            std::cout << int_test << std::endl;
        }
        int &int_test;
};

class notebook
{
    public:
        int int_notebook;
};

class factory
{
    public:
        notebook *p_notebook;
};

int main()
{
    factory f1;
    notebook s1;
    notebook s2;
    s1.int_notebook=10;
    s2.int_notebook=2;

    int notebook::*p_notebook = &notebook::int_notebook;
    f1.p_notebook=&s1;
    CTester t1(f1.p_notebook->*p_notebook);
    f1.p_notebook=&s2;
    CTester t2(f1.p_notebook->*p_notebook);

    return 0;
}

это печатает

10
2
...