Передача адреса в класс и оттуда в его дочерний класс по ссылке в C++

«указатель» содержит адрес «Int». Я хочу передать этот адрес моим заданным классам по ссылке:

class N {
public:
    N(int &pPointer){   
        std::cout << "Address: " << &(pPointer) <<" \n";
    }
};
class M {
public:
    M(int &pPointer):n(pPointer) {              
       std::cout << "Address: " << &pPointer <<" \n";
    }   
    private:
     N n;
};

int main () {
    int Int = 5;
    int *pointer = &Int;    
    std::cout << "Address: " << pointer <<" \n";
    M m(*pointer);  
     return 0;
}

Является ли это хорошей практикой (поскольку я как бы использую ссылку на разыменованный указатель)? Или это совсем ужас? Я просто хочу избежать указателей здесь. (Хотя я вынужден использовать «* указатель» в начале.)


person user1511417    schedule 17.05.2013    source источник
comment
почему вы вынуждены использовать *pointer в начале? Почему бы просто не использовать M m(Int); ?   -  person Sander De Dycker    schedule 17.05.2013
comment
Хороший вопрос! В моем проекте я хочу передать глобальный экран некоторым функциям рендеринга. screen должен быть указателем на SDL_Surface, потому что начальная функция SDL_SetVideoMode возвращает указатель на SDL_Surface. см. здесь: libsdl.org/docs/html/sdlsetvideomode.html   -  person user1511417    schedule 17.05.2013


Ответы (2)


Совершенно нормально передавать по ссылке вместо передачи по указателю, чтобы использовать объект позже, если вы знаете, что используемый вами указатель действителен. Это позволяет вам пропустить проверку nullptr, поскольку ссылки не могут быть нулевыми.
Однако, если вы сохраните ссылку, вы не сможете заменить объект, на который ссылаетесь, другим. Но вы можете сделать это с помощью указателя.
Позже вы можете получить адрес объекта, на который указывает ссылка, но вы действительно думаете, что вам нужно это делать? Потому что вместо этого вы можете использовать ссылку

person spiritwolfform    schedule 17.05.2013

Это нормально, если вам нужно, но рассмотрите возможность использования постоянной ссылки N(const int& pPointer) вместо этого в параметрах функции. Это означает, что вы не можете изменить указатель, чтобы он указывал на что-то другое, но вы все равно можете изменить значение базовой переменной с помощью разыменования.

Также позаботьтесь о том, чтобы сохранить ссылку как элемент данных в классе. Вы можете получить «висячую ссылку», если объект в вызывающем объекте (в вашем случае int) выходит за рамки.

person Bathsheba    schedule 17.05.2013
comment
Для меня это не имеет смысла: ссылка всегда константа, так как она может ссылаться на что-то только один раз. (Принимая во внимание, что указатели могут указывать на разные вещи во время выполнения.) И я хочу, чтобы pPointer мог изменять Int. - person user1511417; 17.05.2013
comment
Не совсем. Если ссылка является объектом (а не POD), вы не можете вызывать неконстантные функции для этого объекта или изменять его данные-члены. Для POD вы также не можете изменить ссылку: например. инт к = 8; const int& l = k; л = 9; неверно, но int k = 8; инт& л = к; л = 9; Это хорошо. - person Bathsheba; 17.05.2013
comment
Но, как я уже сказал: я хочу, чтобы pPointer (в вашем примере l) в классе N мог изменять Int (в вашем примере k). - person user1511417; 17.05.2013