如何通过共享 ptr 访问 class 的成员函数到共享 ptr?
How can I access member function of a class via a shared ptr to a shared ptr?
我有两个 类、foo
和 bar
,其中 bar
包含指向 foo
的指针,如下所示。
#include<iostream>
#include<memory>
class foo {
private:
int num{4};
public:
void sum(const int& to_add) {num += to_add;}
int access_num() {return num;}
};
class bar {
private:
std::shared_ptr<foo> ptr;
public:
void change_ptr(foo& f) {
auto new_ptr = std::make_shared<foo>(f);
ptr = std::move(new_ptr);
}
std::shared_ptr<foo> access_ptr() { return ptr; }
};
如果我想通过bar
中的指针执行foo
的成员函数sum()
,如何实现?
目前,正在尝试
foo f;
std::shared_ptr<bar> bar_ptr = std::make_shared<bar>();
bar_ptr->change_ptr(f);
// Add three to the int stored in f via the pointer
bar_ptr->access_ptr()->sum(3);
std::cout << f.access_num() << std::endl;
不起作用,输出 4.
这段代码
void change_ptr(foo& f) {
auto new_ptr = std::make_shared<foo>(f); // copy constructor
ptr = std::move(new_ptr);
}
调用复制构造函数在堆上创建foo
的实例并用std::shared_ptr
管理它。如果删除 foo 声明中的复制构造函数,则可以检查它。代码不会编译。请注意,您必须至少提供一个默认构造函数,因为如果您明确删除了复制构造函数,零规则将不起作用。
class foo {
private:
int num{4};
public:
foo() = default;
foo(foo const &other) = delete;
void sum(const int& to_add) {num += to_add;}
int access_num() {return num;}
};
foo f
是存储在栈中的自动变量。用std::shared_ptr
来管理也没什么用。您可能需要的是在堆上创建一个 foo 实例并使用 std::shared_ptr 来处理它:
#include<memory>
class foo {
private:
int num{4};
public:
void sum(const int& to_add) {num += to_add;}
int access_num() {return num;}
};
class bar {
private:
std::shared_ptr<foo> ptr;
public:
void change_ptr(std::shared_ptr<foo> f) {
ptr = std::move(f); // f is already a copy, so we can safely move it
}
std::shared_ptr<foo> access_ptr() { return ptr; }
};
int main() {
auto f = std::make_shared<foo>();
std::shared_ptr<bar> bar_ptr = std::make_shared<bar>();
bar_ptr->change_ptr(f);
bar_ptr->access_ptr()->sum(3);
std::cout << f->access_num() << std::endl;
}
我有两个 类、foo
和 bar
,其中 bar
包含指向 foo
的指针,如下所示。
#include<iostream>
#include<memory>
class foo {
private:
int num{4};
public:
void sum(const int& to_add) {num += to_add;}
int access_num() {return num;}
};
class bar {
private:
std::shared_ptr<foo> ptr;
public:
void change_ptr(foo& f) {
auto new_ptr = std::make_shared<foo>(f);
ptr = std::move(new_ptr);
}
std::shared_ptr<foo> access_ptr() { return ptr; }
};
如果我想通过bar
中的指针执行foo
的成员函数sum()
,如何实现?
目前,正在尝试
foo f;
std::shared_ptr<bar> bar_ptr = std::make_shared<bar>();
bar_ptr->change_ptr(f);
// Add three to the int stored in f via the pointer
bar_ptr->access_ptr()->sum(3);
std::cout << f.access_num() << std::endl;
不起作用,输出 4.
这段代码
void change_ptr(foo& f) {
auto new_ptr = std::make_shared<foo>(f); // copy constructor
ptr = std::move(new_ptr);
}
调用复制构造函数在堆上创建foo
的实例并用std::shared_ptr
管理它。如果删除 foo 声明中的复制构造函数,则可以检查它。代码不会编译。请注意,您必须至少提供一个默认构造函数,因为如果您明确删除了复制构造函数,零规则将不起作用。
class foo {
private:
int num{4};
public:
foo() = default;
foo(foo const &other) = delete;
void sum(const int& to_add) {num += to_add;}
int access_num() {return num;}
};
foo f
是存储在栈中的自动变量。用std::shared_ptr
来管理也没什么用。您可能需要的是在堆上创建一个 foo 实例并使用 std::shared_ptr 来处理它:
#include<memory>
class foo {
private:
int num{4};
public:
void sum(const int& to_add) {num += to_add;}
int access_num() {return num;}
};
class bar {
private:
std::shared_ptr<foo> ptr;
public:
void change_ptr(std::shared_ptr<foo> f) {
ptr = std::move(f); // f is already a copy, so we can safely move it
}
std::shared_ptr<foo> access_ptr() { return ptr; }
};
int main() {
auto f = std::make_shared<foo>();
std::shared_ptr<bar> bar_ptr = std::make_shared<bar>();
bar_ptr->change_ptr(f);
bar_ptr->access_ptr()->sum(3);
std::cout << f->access_num() << std::endl;
}