0

我正在用 C++ 组合我自己的(愚蠢的)标量/列表/哈希(perl-like..)东西。

我遇到了必须将标量取消引用到列表中的问题,并且在尝试初始化时它不起作用。

List几个默认构造函数,其中 5 个范围从List()List(Scalar, Scalar, Scalar, Scalar).

List stuff(1, 2, 3);
Scalar aref = stuff; // List overloads the (Scalar) cast operator

// the following line is the unwanted thing..
List failist = aref; // uses List::List(Scalar), so same as `List failist(aref);`

// however, these work
List thisworks;
thisworks = aref;
thisworks.operator=(aref);

列表标题:

class List : public Thing {
    std::vector<Scalar> stuff;
public:
    List();
    List(Scalar s1); // this gets called because initialization
    List(Scalar s1, Scalar s2);
    List(Scalar s1, Scalar s2, Scalar s3);
    List(Scalar s1, Scalar s2, Scalar s3, Scalar s4);
    List &operator=(const Scalar &other); // but i want this

    /* some getters/setters cut away */

    operator Scalar();
};

我真的很想用List mylist = listreference;,怎么办?

4

2 回答 2

2

我想知道您是否不想List myList = scalar调用构造函数,那么为什么首先要有它?

无论如何,将其明确表示为:

explicit List(Scalar s1);. 

这样,您将使编译器在线吐出错误:

List myList = scalar; //error 

然后您将有机会通过以下方式纠正自己:

List myList(scalar); //ok

或者,

List myList; 
myList = scalar; //ok

请注意,您不能进行List myList = scalar调用List& operator=(Scalar const&),但是您可以根据其他方式实现一个,或者根据某些常用init功能实现两者,以避免代码重复。后一种方法更好。

于 2013-02-17T11:55:37.810 回答
1

你不能这样做。List mylist = listreference;表示:使用复制构造函数创建 List 类型的 mylist 对象。所以你有2个选择:

  1. 通过 operator= 实现复制构造函数
  2. 用两行代码来做:List mylist = listreference; mylist = listreference;
于 2013-02-17T11:44:34.360 回答