Копирование указателей в C ++ - PullRequest
1 голос
/ 18 марта 2010

У меня есть класс A, содержащий два указателя на объекты другого класса B. Я хочу инициализировать один или другой указатель в зависимости от того, какой из них передан в init(), который также принимает другие параметры. Моя ситуация, таким образом, следующая:

class A {

public:
    A();
    init(int parameter, int otherParameter, B* toBeInitialized);

protected:
    B* myB;
    B* myOtherB;

};

Теперь я хочу сказать init() как:

init(640, 480, this->myB);

или

init(640, 480, this->myOtherB);

Теперь мой init реализован так:

void init( int parameter, int otherParameter, B* toBeInitialized ) {

    toBeInitialized = someConstructorFunction(parameter, otherParameter);

}

Проблема в том, что два указателя не инициализированы, я подозреваю, что toBeInitialized перезаписано, но исходный параметр не изменен.

Я что-то не так делаю? Должен ли я использовать ссылки на указатели?

Спасибо.
Томмазо

Ответы [ 4 ]

6 голосов
/ 18 марта 2010

Да, изменить на

void init( int parameter, int otherParameter, B*& toBeInitialized ) {

    toBeInitialized = someConstructorFunction(parameter, otherParameter);

}

В исходном коде toBeInitialized передается по значению, и будет изменена только локальная копия переменной.

3 голосов
/ 18 марта 2010

Это, очевидно, проблема сокращения, но, как уже говорилось, было бы лучше иметь что-то вроде этого:

class A {

public:
    A();
    B* buildB(int parameter, int otherParameter);

protected:
    B* myB;
    B* myOtherB;

};

Затем вызовите функцию как

this->myB = buildB(640, 480);

Преобразование третьего параметра в ссылку (или указатель) на член будет работать, но пахнет так, будто ваш дизайн может быть неправильным.

2 голосов
/ 18 марта 2010

Вы передаете toBeInitialized по значению, поэтому значение, измененное внутри init(), не отображается снаружи. Вам нужно либо передать ссылку на указатель toBeInitialized, либо двойной указатель. изменить подпись инициализации на init(int, int, B*&) или init(int,int,B**);

1 голос
/ 18 марта 2010

Рассмотрите возможность использования указателей на членов. (это даст вам немного больше безопасности.)

void A::init(int p1, int p2, B * A::* memberToInit)
{
    this->*memberToInit = SomeConstructorFunc(p1, p2);
}

И использование будет

myObject.init(480, 620, &A::myB);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...