Complie错误:无法转换

Complie Error: could not convert

本文关键字:转换 错误 Complie      更新时间:2023-10-16

我正在尝试将用户输入的特定数量的电影放入数组中。然后我将在函数中使用类数组的指针,如下所示

当我编译程序时,它会给我一条错误消息,上面写着"无法将'(MovieData*((&pMovie('从'MovieData*'转换为MovieData'

我的身体

int amount = 0;
cout << "How many movies did you watch last month?";
cin >> amount;
MovieData *pMovie[amount];
*pMovie = new MovieData[amount];
cout << "Please enter the information of your Movies!" << endl;
readMovieData(pMovie, amount);         //This line!
cout << "Here are the information with your Movies!" << endl;
MovieDatastats(pMovie, amount);        //This line!

这是我的功能

void readMovieData(MovieData *pMovie, int const size)
{
string title;
string director;
int year;
int time;
for(int i = 0; i < size; i++)
{
    cout << "Please enter the Title of the movie.";
    getline(cin,title);
    pMovie[i].setTitle(title);
    cout << "nPlease enter the Director name of the movie.";
    getline(cin,director);
    pMovie[i].setDirector(director);
    cout << "nPlease enter the year it was released.";
    cin >> year;
        if(year >= 1900 && year <= 2004)
            pMovie[i].setYear(year);
        else
        {
            cout << "Please enter a year between 1900 and 2004." << endl;
            year = 0;
        }
    cout << "nPlease enter the time the movie last.";
    cin >> time;
        if(time > 0 && time < 14400)
            pMovie[i].setTime(time);
        else
        {
            time = 0;
            cout << "Please enter a time between 0 and 14400 in minutes." << endl;
        }
    }
}

这是我的功能,设置信息到私人类

和另一个功能,它是玩私人类的信息

void MovieDatastats(MovieData *pMovie, int const size)
{
float sumTime = 0.0;
float averageTime = 0.0;
for (int i = 0; i < size; i++)
{
    sumTime +=pMovie[i].getTime();
}
averageTime = sumTime/size;
cout << "Your average time of all your movie is: " << averageTime << endl;
int oldYear = 0;
int count = 0;
int recentYear = 0;
int counter = 0;
oldYear = pMovie[0].getYear();
recentYear = pMovie[0].getYear();
for (int j = 1; j < size; j++)
{
    if(pMovie[j].getYear() < oldYear)
    {
        oldYear = pMovie[j].getYear();
        count = j;
    }
    else if(pMovie[j].getYear() > recentYear)
    {
        recentYear = pMovie[j].getYear();
        counter = j;
    }
}
cout << "The oldest Movie you have watched is called..." << endl;
cout << "Title: " << pMovie[count].getTitle() << endl;
cout << "Director: " << pMovie[count].getDirector() << endl;
cout << "Release Year: " << pMovie[count].getYear() << endl;
cout << "The most newest Movie you have watched is called..." << endl;
cout << "Title: " << pMovie[counter].getTitle() << endl;
cout << "Director: " << pMovie[counter].getDirector() << endl;
cout << "Release Year: " << pMovie[counter].getYear() << endl;
}

此外,如何删除分配的内存并将指针设置为指向NULL?

您的问题在这里:

MovieData *pMovie[amount];
*pMovie = new MovieData[amount];

第一行声明了一个Movie数据指针数组。你不想这样——你想要的是一个指向MovieData的指针。因此,第二条线也是错误的。以下是更正:

MovieData *pMovie;
pMovie = new MovieData[amount];

至于何时解除分配,这就是使用上述代码的危险所在。当您不再需要pMovie时,您将解除分配。但当你不再需要的时候,这就是内存检查器存在的原因——很容易出错。这就是矢量如此方便的原因:

#include <vector>
//...
std::vector<MovieData> pMovie(amount);

就是这样。不需要分配任何东西。现在,要将其与现有函数接口,请传递向量中第一个元素的地址:

readMovieData(&pMovie[0], pMovie.size());
MovieData *pMovie[amount];

MovieData *pMovie

是两种不同的类型。第一个是具有MovieData *类型元素的数组,而第二个是标量类型,即指向MovieData的指针。

您以以下方式声明函数readMovieData和MovieDatastats

void readMovieData(MovieData *pMovie, int const size);
void MovieDatastats(MovieData *pMovie, int const size);

具有类型的第一个参数

MovieData *pMovie

但是,当您调用这些函数时

readMovieData(pMovie, amount);
MovieDatastats(pMovie, amount);

你通过作为论点

MovieData *pMovie[amount];

编译器无法隐式转换MovieData*pMovie〔amount〕;到MovieData*pMovie。

功能应声明为

void readMovieData(MovieData **pMovie, int const size);
void MovieDatastats(MovieData **pMovie, int const size);

相应地,您需要更改函数体。

或者,您可以拥有声明的函数,但将其作为参数传递给它们

*pMovie

这是数组的第一个元素。

例如

void readMovieData(MovieData *pMovie, int const size);
void MovieDatastats(MovieData *pMovie, int const size);
//...
readMovieData(*pMovie, amount);
MovieDatastats(*pMovie, amount);