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::string从空指针初始化 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 回答