我在C ++中整理了我自己的(愚蠢的)Scalars / List / Hash(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;
,我该怎么做?
答案 0 :(得分: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
函数实现两者,以避免代码重复。后一种方法更好。
答案 1 :(得分:1)
你不能这样做。 List mylist = listreference;
表示:使用复制构造函数创建List类型的mylist对象。所以你有两个选择:
List mylist = listreference;
mylist = listreference;