c ++ Сделать указатель на другой внутри функции - PullRequest
0 голосов
/ 27 мая 2018

Я работаю над тем, что приводит меня к ситуации, подобной примеру ниже.Я хочу, чтобы b указывал на a после включения test () .Возможно ли это или создание копии - единственное решение?

Спасибо.

void test(Object* a, Object* b)
{
    std::cout << "test a: " << a << std::endl;
    std::cout << "test b: " << b << std::endl;
    b = a;
    std::cout << "test b assigned: " << b << std::endl;
}

int main()
{
    Object* a = new Object();
    Object* b = nullptr;
    test(a, b);
    std::cout << "a: " << a << std::endl;
    std::cout << "b: " << b << std::endl;
    delete a;
    delete b;
}

test a: 0x1aa8930
test b: 0
test b assigned: 0x1aa8930
a: 0x1aa8930
b: 0

Ответы [ 3 ]

0 голосов
/ 27 мая 2018

Чтобы изменить указатель, вам необходимо:

  • передать указатель на указатель
    void test(Object **a, Object **b)
    test(&a,&b);
    После чего вам нужноразыменование, если вы хотите изменить указатель.
  • Передайте ссылку на указатель
    void test(Object *&a, Object *&b)
    test(a,b);
    Здесь вам не нужно ничего разыменовывать, если вы хотитеизмените адрес.

Для a необязательно передавать указатель на указатель или ссылку на указатель (если только вы не планируете изменить его в будущем), но дляb Вы должны изменить его.

PS измените void main() на int main()

0 голосов
/ 27 мая 2018

В настоящее время у нас есть нечто, называемое shared_ptr, которое точно соответствует тому, что вы хотите.Кроме того, вам не нужно очищать его после того, как вы закончили с ним!

Пример:

#include <memory>
#include <iostream>

using Object = int;

void test(const std::shared_ptr<Object>& a, std::shared_ptr<Object>& b)
{
    b = a;
    std::cout << "test b assigned: " << b.get() << "\n";
}

int main()
{
    auto a = std::make_shared<Object>();
    std::shared_ptr<Object> b;

    std::cout << "test a: " << a.get() << "\n";
    std::cout << "test b: " << b.get() << "\n";

    test(a, b);

    std::cout << "test a: " << a.get() << "\n";
    std::cout << "test b: " << b.get() << "\n";

    return 0;
}

вывод (г ++ 5.4.0):

test a: 0x21e2c30
test b: 0
test b assigned: 0x21e2c30
test a: 0x21e2c30
test b: 0x21e2c30

живая демоверсия

0 голосов
/ 27 мая 2018

Вы можете сделать так:

void test(Object* a, Object*& b)
{
    std::cout << "test a: " << a << std::endl;
    std::cout << "test b: " << b << std::endl;
    b = a;
    std::cout << "test b assigned: " << b << std::endl;
}

int main()
{
    Object* a = new Object();
    Object* b = NULL;
    test(a, b);
    std::cout << "a: " << a << std::endl;
    std::cout << "b: " << b << std::endl;
    delete a, b;
}

Вывод будет:

test a: 0x7a0d28
test b: 0
test b assigned: 0x7a0d28
a: 0x7a0d28
b: 0x7a0d28

Это потому, что вы задали значение b, а не ссылку на него,который требуется изменить его.Переменные могут быть изменены только функцией, если эта функция получает адрес этих переменных, и это может быть сделано только через указатель (Object **) или ссылку (Object * &)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...