0

私は自分の (ばかげた) スカラー/リスト/ハッシュ (perl のような..) を C++ でまとめています。

スカラーをリストに逆参照しなければならない点に遭遇しましたが、初期化を試みても機能しません。

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. opeartor= を使用してコピー コンストラクターを実装する
  2. 次の 2 行のコードで行います。List mylist = listreference; mylist = listreference;
于 2013-02-17T11:44:34.360 に答える