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

我如何使用其初始值设定项列表构造函数以外的其他方法为类成员设置默认值

如何解决我如何使用其初始值设定项列表构造函数以外的其他方法为类成员设置默认值

假设我有这样的东西:

UI

这很好用,通过调用<script> export default { data: function () { return { availability: {} } },methods: { onComplete(results,file){ // Your logic here! functions or axios calls this.availability = results; console.log(this.availability); },readFile() { /* return first object in FileList */ var file = event.target.files[0]; this.$papa.parse(file,{ header: true,complete: this.onComplete // your vue methods }); } } } </script> 的构造函数class A { public: A(int x,int y) { std::cout << "Constructed from parameters" << std::endl; } // Non-copyable,non-movable A(A const&) = delete; A(A&&) = delete; A& operator=(A const&) = delete; A& operator=(A&&) = delete; }; class B { public: B() = default; private: A a{1,2}; }; int main() { B b; return 0; } 初始化为认值,并打印a


然后,假设我想以不同的方式初始化A,因此我添加一个带有初始化器列表的构造函数并更改了我的代码

Constructed from parameters

一切仍然按照我的要求进行,代码通过调用a的第二个构造函数,并使用认值初始化class A { public: A(int x,int y) { std::cout << "Constructed from parameters" << std::endl; } A(std::initializer_list<int> someList) { std::cout << "Constructed from an initializer list" << std::endl; } // Non-copyable,2,3}; }; int main() { B b; return 0; } 并打印a


现在,假设我想保持A不变,但是要通过第一个构造函数返回设置Constructed from an initializer list认值。如果A是可移动的,我可以使用a,但是这里不是这种情况,那么我该如何处理?使用该构造函数设置认值显然是不可能的吗?

编辑:我正在寻找一种适用于C ++ 14的解决方案,但是如果我在C ++ 17或C ++ 20中有更好的解决方案,那我也想知道。

解决方法

如果A是可移动的,我可以使用<?php header('Content-Type: application/json;charset=utf-8');// all echo statements are json_encode include('se.php'); include('db.php'); session_start(); $doctordb = new doctorModel; //instantiate database to start using $result = $doctordb->showDoctorinfo(); if($result == false) { http_response_code(204); // no content } elseif(is_array($result)) { http_response_code(200); //success echo json_encode($result); } ?> ,但事实并非如此 在这里

好吧,对于C ++ 17和更高版本,您可以在此处使用A a = A(1,2);,只要您将其用作声明/初始化!以下工作原理(在第二段代码中):

A a = A(1,2);

和“由参数构造”被调用。这是因为这里没有 actual 赋值操作,只有 initialization 。但是,由于您所说的原因,以下操作将失败:

class B {
public:
    B() = default;
private:
    A a = A( 1,2 ); // No assignment here - just an initialization.
};

编辑:C ++ 17之前的版本,以下是一种变通方法,在class B { public: B() { a = A( 1,2 ); } // error C2280: 'A &A::operator =(A &&)': attempting to reference a deleted function private: A a{ 1,2,3 }; }; 的默认构造函数的初始化列表中使用“老式”的圆括号而不是大括号。在clang-cl和MSVC中为C ++ 14):

B
,

我认为,如果没有某种“ hack”,这在C ++ 14中是不可能的。一种这样的技巧是采用额外的歧义参数。例如:

class From_params {};

class A {
public:
    A(int,int,From_params = {})      // (1)
    {}
    
    A(std::initializer_list<int>)      // (2)
    {}

    ...
};

class B {
public:
    B() = default;

private:
    A a{1,From_params{}};  // calls (1)
};

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