如何解决如何在 C++ 11 中传递智能指针而不是“this”?
我正在使用 c++11 编译器。
我有两个班级 - 班级 Test
和班级 TestHelper
。
类 Test
是类 TestHelper
的朋友。
Test
类是我们只能从外部访问的类。
现在,我们要调用 Test
API,即 setVal()
。这个 setVal()
应该调用
Test2
API 即 setX 并期待这个指针。我不想使用这个指针,但想要
改为使用智能指针。我该怎么做?
这种可取性的概念是因为实际上,我的类 Test
非常大。所以,我正在尝试为 Test
即
class TestHelper;
class Test
{
friend class TestHelper;
int x;
public:
void display() {
std::cout << x;
}
void setVal(int val) {
TestHelper testH;
testH.setX(this,324);
}
};
class TestHelper
{
public:
void setX(Test *test,int val) {
/** some algorithm here and then change val to something else */
test->x = val*100;
}
};
int main()
{
std::cout << "Hello World!\n";
Test x;
x.setVal(130);
}
我尝试将原型从 void setX(Test *test,int val)
到 void setX(std::shared_ptr<Test> test,int val)
但不知道如何传递这个指针
在这里std::shared_ptr<Test> test
。
解决方法
所以这里是共享指针的工作解决方案。由于缺少定义,该示例甚至无法编译,因此您必须将代码重组为头文件和 cpp 文件。
Test.h:
#ifndef TEST_H
#define TEST_H
#include <memory>
#include "TestHelper.h"
class Test : public std::enable_shared_from_this<Test>
{
private:
friend class TestHelper;
int x;
public:
void display();
void setVal(int val);
};
#endif
Test.cpp:
#include <iostream>
#include "Test.h"
void Test::display() {
std::cout << x;
}
void Test::setVal(int val) {
TestHelper testH;
testH.setX(shared_from_this(),324);
}
TestHelper.h:
#ifndef TESTHELPER_H
#define TESTHELPER_H
class Test;
class TestHelper
{
public:
void setX(std::shared_ptr<Test> test,int val);
};
#endif
TestHelper.cpp:
#include <memory>
#include "TestHelper.h"
#include "Test.h"
void TestHelper::setX(std::shared_ptr<Test> test,int val) {
/** some algorithm here and then change val to something else */
test->x = val*100;
}
main.cpp:
#include <iostream>
#include <memory>
#include "Test.h"
int main(void){
std::cout << "Hello World!\n";
auto x = std::make_shared<Test>();
x->setVal(130);
x->display();
}
您可以在这里运行它:https://paiza.io/projects/e/79dehCx0RRAG4so-sVZcQw
,我不明白你为什么要这个,这里有一些编译的变体
参考
// Reference variant
#include <iostream>
class Test;
class TestHelper
{
public:
void setX(Test & test,int val);
};
class Test
{
friend class TestHelper;
int x;
public:
void display() {
std::cout << x;
}
void setVal(int val) {
TestHelper testH;
testH.setX(*this,324);
}
};
void TestHelper::setX(Test &test,int val)
{
/** some algorithm here and then change val to something else */
test.x = val*100;
}
int main()
{
Test x;
x.setVal(130);
x.display();
}
共享ptr
// Shared ptr variant
#include <iostream>
#include <memory> // Required for shared_ptrs
class Test;
class TestHelper
{
public:
void setX(std::shared_ptr<Test> test,int val);
};
class Test : public std::enable_shared_from_this<Test>
{
friend class TestHelper;
int x;
public:
void display() {
std::cout << x;
}
void setVal(int val) {
TestHelper testH;
testH.setX(shared_from_this(),324);
}
};
void TestHelper::setX(std::shared_ptr<Test> test,int val)
{
/** some algorithm here and then change val to something else */
test->x = val*100;
}
int main()
{
auto x = std::make_shared<Test>(); // x needs to be created as shared_ptr or it won't work
x->setVal(130);
x->display();
}
也许可以通过这些来完善您的问题?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。