微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 C++ 11 中传递智能指针而不是“this”?

如何解决如何在 C++ 11 中传递智能指针而不是“this”?

我正在使用 编译器。

我有两个班级 - 班级 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;
}

ma​​in.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();
}

http://cpp.sh/7t3ec

共享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();
}

http://cpp.sh/87ao2

也许可以通过这些来完善您的问题?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。