2

委任されたコンストラクターを使用しようとしており、この質問この質問にある形式に従おうとしていますが、まだ問題があります。

私のplayer.hファイルはこれです:

#ifndef PLAYER_H_
#define PLAYER_H_

#include <string>

class Player
{
public:
   Player(void);
   Player(std::string name, int score);
   ~Player();
protected:
   std::string name_;
   int score_;
};

#endif

私のplayer.cppファイルはこれです:

#include "player.h"
Player::Player(std::string name, int score)
{
   score_ = score;
   name_ = name;
}

Player::Player(void) : Player(NULL,0)
{

}

ただし、コンパイルしようとすると、次のエラーが発生します。

1>a:\projects\test\src\player.cpp(5): error C2614: 'Player' : illegal member initialization: 'Player' is not a base or member

私は何を間違っていますか?関連する場合は、VS2012 を使用しています。

4

2 に答える 2

14

関連する場合は、VS2012 を使用しています。

これは、Visual Studioがこの C++11 機能を実装していないためです。ごめん。実装されていない C++11 機能がかなりあります。

于 2012-09-24T20:39:47.913 に答える
7

これはあなたの質問への回答ではありませんが、あなたのコンパイラはデリゲート コンストラクターをサポートしていませんが、そうでなければあなたのコードが被るであろういくつかの問題に対処したいと思います。

  1. 割り当てではなく、初期化子リストを使用します。

  2. 重いオブジェクトを構築するときは、値を渡して移動します。

  3. std::stringnull ポインターから a を初期化することはできません。空の文字列が必要な場合は、空の文字列を渡します。

  4. 非常にまれに、非常に例外的なケースでデストラクタを使用する必要があります。

すべてをまとめると、次のコードに到達します。

class Player
{
public:
   Player(std::string name, int score)
   : name_(std::move(name))
   , score_(score)
   { }

   Player()
   : Player("", 0)
   { }

protected:
   std::string name_;
   int         score_;
};
于 2012-09-24T20:49:32.963 に答える