错误:无法转换' p1'来自' Person(*)()'到了'人物'#39;

时间:2014-08-13 13:29:11

标签: c++

我得到了

error: could not convert 'p1' from 'Person (*)()' to 'Person'

每当我使用默认构造函数时(当我创建Person p1时),我知道它是因为我使用了char数组,但是我必须使用它,我不能使用字符串<\ n / p>

我还得到2个警告

warning: converting to non-pointer type 'char' from NULL [-Wconversion-null]|

在默认构造函数

warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]| 

当我创建Person p2

所以这是我的代码

#include <iostream>
#include <string>
#include <stdlib.h>
#include <stdio.h>
using namespace std;

class Person{
   private:
    char* name;
    char gender;
    int age;
   public:
    Person();
    Person(char*, char, int);
    friend void printInfo(Person);
};

Person::Person()
:name(NULL), gender(NULL), age(0) // this results in the first warning
{
}
Person::Person(char* n, char g, int a)
:name(n), gender(g), age(a)
{
}
void printInfo(Person p){
 cout << "Name: " << p.name << endl;
 cout << "Age: " << p.age << endl;
 cout << "Gender: " << p.gender << endl;
}

int main()
{
Person p1(); // this results in an error
printInfo(p1);

Person p2("Max", 'm', 18); // this results in the second warning
printInfo(p2);

return 0;
}

2 个答案:

答案 0 :(得分:9)

您正在遇到most vexing parse

Person p1();声明一个名为p1的函数,该函数返回Person并且不带参数。如果您想默认构建一个名为Person的{​​{1}}对象,只需说p1

答案 1 :(得分:2)

首先发出警告是因为您尝试将NULL分配给性别,这是一个字符。

第二个是因为你将const char指针指向对象中的非const char指针。使用char const *(或const char*)作为指针类型是摆脱此警告的方法之一。使用char * const无济于事,因为它基本上意味着指向可修改字符串的const指针(即你不能改变指针,但你可以改变字符串),当你给它一个字符串常量时不是这种情况。