【问题标题】:How to pass const struct pointer to a setter method in C++如何将 const struct 指针传递给 C++ 中的 setter 方法
【发布时间】:2021-11-02 12:54:08
【问题描述】:

我正在尝试将 const struct 指针传递给自动生成的 C++ API 代码的 setter setContainer,因此我无法更改类:

#include <iostream>
#include <memory>

class Class // Class definition
{
public:
    struct Container    // Container definition
    {
        double value = 0.0;
    };

    Class() { } // constructor
    ~Class() { } // destructor

    void setContainer(const Container * pContainer)
    {   
        mContainer = *pContainer; // setter
    }

    const Class::Container & getContainer() const
    {
        return mContainer; // getter
    }

private:
    Container mContainer;
};

如您所见,我不知道如何以正确的方式将结构对象传递给setContainer 方法。当我使用 C++14 时,智能指针会更好。

int main()
{    
    Class objClass; 

    const auto container1 = objClass.getContainer();

    // Output: container1.value: 0.0
    std::cout << "container1.value: " << container1.value << std::endl; 
    
    // Need to set this at runtime
    Class::Container container2;
    container2.value = 5.0; 

    // Output: container2.value: 5.0
    std::cout << "container2.value: " << container2.value << std::endl; 
    
    // ERROR: no matching function for call to ‘Class::setContainer(Class::Container&)’
    objClass.setContainer(container2); 
    
    const auto container3 = objClass.getContainer();

    // Desired Output: container3.value: 5.0 (set by setContainer)
    std::cout << "container3.value: " << container3.value << std::endl; 

    return 0;
}

非常感谢您能帮我解决这个问题。

【问题讨论】:

  • 您甚至可以考虑完全不使用任何指针。 void setContainer(const Container& container) 会更安全。 (您不能将 nullptr 放在引用中)
  • void setContainer(const Container * pContainer) 更改为void setContainer(Container const&amp; pContainer)。否则,您还需要检查 nullptr,调用者必须传入 Container 的地址。

标签: c++ c++11 c++14


【解决方案1】:

您的 setter 函数需要一个指向 Container 对象的指针,所以给它一个:只需将 &amp; operator 添加到您的参数中:

    objClass.setContainer(&container2);

【讨论】:

    【解决方案2】:

    您可以使用智能指针和 get() 函数来提取原始指针,如下所示

    std::shared_ptr<Class::Container>m_container2 = std::make_shared<Class::Container>(container2);
     objClass.setContainer(m_container2.get()); 
    

    或者你可以使用 & 运算符来获取指针。

    【讨论】:

      猜你喜欢
      • 2018-08-09
      • 2021-08-15
      • 2011-03-11
      • 2016-05-18
      • 1970-01-01
      • 1970-01-01
      • 2012-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多