小编And*_*zzo的帖子

避免通过操作从私有构造函数中间接实例化

我正在尝试创建一个类,其对象必须包含其值表示的简短描述("名称").因此,唯一的公共构造函数应该将一个字符串作为参数.

但是,对于操作,我需要创建临时(无相关名称)对象来计算要分配给现有对象的值.为此,我实现了一个私有构造函数,不应该直接或间接地使用它来实例化一个新对象 - 这些临时对象应该只通过operator =分配给一个已经存在的对象,它只复制值而不是名称和价值.

问题来自于使用"自动".如果新变量声明如下:

auto newObj = obj + obj;
Run Code Online (Sandbox Code Playgroud)

编译器推导出operator +的返回类型,并直接将其结果赋值给newObj.这会导致对象具有不相关的名称,这不应该是实例化的.

此外,从某些功能仍然可以推断出已存在对象的类型,例如:

auto newObj = obj.makeNewObjWithSameTypeButOtherName("Other name");
Run Code Online (Sandbox Code Playgroud)

按照展示问题的代码:

#include <iostream>
#include <string>

using namespace std;

template<class T>
class Sample
{
    public:
    Sample(const string&);

    Sample<T> makeNewObj(const string&);
    // Invalid constructors
    Sample();
    Sample(const Sample&);

    void operator=(const Sample&);
    void operator=(const T&);

    Sample<T> operator+(const Sample&) const;

    void show(void);

private:
// Private constructor used during operations
Sample(const T&);

T _value;
string _name;


};

template<class T>
Sample<T>::Sample(const string& name)
{
    this->_name …
Run Code Online (Sandbox Code Playgroud)

c++ constructor overloading private

9
推荐指数
2
解决办法
190
查看次数

标签 统计

c++ ×1

constructor ×1

overloading ×1

private ×1