c ++ - 构造函数不能用于初始化

时间:2017-04-28 16:02:06

标签: c++ class

我遇到了问题,我很乐意提供帮助。

我有一个班主任:

class Player{

public: 

char Name[20];
Dice* dice;
int points; 

Player(char name[20], Dice* dice){//constructor
    for (int i = 0; i < 20; i++)
        Name[i] = name[i];
    points = 0;
} 

在我的主要版本中我尝试:

    Player* p1("aaa",d1);
    Player* p2("ddd",d2);

错误:

error a value of type const char * cannot be used to initialize an entity of 
type "Player*"

它只是代码的一部分,但除了这个代码之外,所有其余代码都很好。

感谢的。

3 个答案:

答案 0 :(得分:2)

第1步:修复
Player* p1是指向Player对象的指针,您需要指向一个对象:

Player playerP1("aaa",d1);

Player* p1(&playerP1);

所以你有一个由playerP1

指向的对象p1

同意p2;

第2步:去亲 您还可以使用std::make_uniquestd::make_shared

动态指向动态指针
auto p1 = std::make_shared<Player>("aaa",d1);

所以你使用智能指针的好处,避免使用new和裸新(现在不推荐使用)。

答案 1 :(得分:1)

您可以使用new动态构造对象并分配给指针:

Player *p1 = new Player("aaa", d1);

您还应该将构造函数更改为const char name[]。否则,您不能使用字符串文字作为参数。

name复制到Name的循环需要检查空字节,否则您将读取"aaa"的结尾。

Player(const char name[], Dice* dice){//constructor
    for (int i = 0; i < sizeof(Name); i++) {
        Name[i] = name[i];
        if (name[i] == 0) {
            break;
        }
    }
    points = 0;
}

如果您使用std::string而不是固定长度的char数组,那可能会更好。

=== phonetagger添加的示例... === (当Barmar发布这个答案时,我正在努力回答。)

#include <string>

class Player
{

public:
   std::string Name;
   Dice* dice;
   int points;

   //constructor
   Player(std::string name, Dice* dice)
      : Name(name), dice(dice), points(0)
   {
   }
};

int main()
{
   Dice *d1 = new Dice();

   Player* p1 = new Player("aaa", d1);
   Player* p2 = new Player("ddd", d1);
}

答案 2 :(得分:-2)

将构造函数更改为

Player(const char *name, Dice* dice)
相关问题