Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用带指针的数组?_C++ - Fatal编程技术网

C++ 如何使用带指针的数组?

C++ 如何使用带指针的数组?,c++,C++,我是编程新手,尝试创建一个包含一系列记录的数组,然后让程序接受输入,最后打印出列表的内容 我在记录addRecord函数中某些变量的值时遇到问题,因为下面代码的输出如下: constructor called -1:-1 Eat lunch -1:-1 Watch TV destructor called 为什么我错过了L1.addRecord5,30,做晚饭的电话;完全地,为什么时间没有通过,它们通过构造函数中设置的-1通过 多谢各位 #include <iostream>

我是编程新手,尝试创建一个包含一系列记录的数组,然后让程序接受输入,最后打印出列表的内容

我在记录addRecord函数中某些变量的值时遇到问题,因为下面代码的输出如下:

constructor called
-1:-1 Eat lunch

-1:-1 Watch TV

destructor called
为什么我错过了L1.addRecord5,30,做晚饭的电话;完全地,为什么时间没有通过,它们通过构造函数中设置的-1通过

多谢各位

#include <iostream>
#include <string>
using namespace std;

class Record {
private:
    int hour;
    int minute;
    string todo;

public:
    Record()
    {
        hour = -1;
        minute = -1;
        todo = "N/A";
    }

    void setData(int hour, int minute, const char* td);
    void setData(Record& e);
    void printRecord();
};

class List
{
private:
    Record* recordArr;
    int maxRecords;
    int actualRecordCount;

public:
    List(int maxRecords);

    List(List& s) {
        actualRecordCount = s.actualRecordCount;
        maxRecords = s.maxRecords;
        recordArr = new Record[maxRecords];
        for (int i = 0; i < actualRecordCount; i++)
        {
            recordArr[i].setData(s.recordArr[i]);
        }

        std::cout << "copy constructor called." << std::endl;
    }
    ~List();
    bool addRecord(int hour, int minute, const char* todo);
    void printList();
};


///////////////////////////

void Record::setData(int hour, int minute, const char* td)
{
    hour = hour;
    minute = minute;
    todo = td;
}

void Record::setData(Record& e) 
{
    hour = e.hour; 
    minute = e.minute;
    todo = e.todo;
}

void Record::printRecord()
{
    std::cout << hour << ":" << minute << " " << todo << std::endl;
}

List::List(int maxRecords)
    : maxRecords(maxRecords)
{
    actualRecordCount = 0;
    recordArr = new  Record[maxRecords];
    std::cout << "constructor called" << std::endl;
}

List::~List()
{
    std::cout << "\ndestructor called";
    delete[] recordArr;
}

bool List::addRecord(int hour, int minute, const char* todo)
{
    Record newRecord; // create new Record
    newRecord.setData(hour, minute, todo); //assign values

    if (actualRecordCount >= maxRecords) // array full
    {
        return false;
    }

    else
    {
        recordArr[actualRecordCount] = newRecord; // put new Record into the array of Entry
        actualRecordCount++; // increment Entry count
        return true;
     }

}

void List::printList()
{
    for (int i = 0; i < actualRecordCount; i++)
    {
        recordArr[i].printRecord();
        cout << endl;
        i++;
    }

}

int main() {

    List L1(20);
    L1.addRecord(2, 30, "Eat lunch");
    L1.addRecord(5, 30, "Make dinner");
  L1.addRecord(7, 30, "Watch TV");
    L1.printList();

}
hour是此setData方法的参数名称。小时=小时;,因此,将此参数设置为自身。不管怎样,这绝对是一事无成的。接下来的两个作业也一样

这里您的明显意图是初始化碰巧有同名成员的类。当不同的事物在C++中有相同的名称时,有一组复杂的规则来选择名称所代表的东西。在=运算符的左侧和右侧,这些规则是相同的,因此这两个小时都指向同一个对象:该类方法的参数

您只需将参数重命名为方法:

void Record::setData(int hourArg, int minuteArg, const char* tdArg)
{
    hour = hourArg;
等等。或者,如果希望保持参数名称不变,请使其更加明确:

this->hour=hour;
hour是此setData方法的参数名称。小时=小时;,因此,将此参数设置为自身。不管怎样,这绝对是一事无成的。接下来的两个作业也一样

这里您的明显意图是初始化碰巧有同名成员的类。当不同的事物在C++中有相同的名称时,有一组复杂的规则来选择名称所代表的东西。在=运算符的左侧和右侧,这些规则是相同的,因此这两个小时都指向同一个对象:该类方法的参数

您只需将参数重命名为方法:

void Record::setData(int hourArg, int minuteArg, const char* tdArg)
{
    hour = hourArg;
等等。或者,如果希望保持参数名称不变,请使其更加明确:

this->hour=hour;
一个问题是,具有三个参数的Record::setData函数实际上没有设置类对象的小时和分钟字段!这是因为您使用了与类成员同名的参数,这是一种糟糕的编码风格。因此,在下面的代码中,前两个赋值只是将参数值替换为它们自己:

无效记录::setDataint小时,int分钟,const字符*td { hour=hour;//这一行和下一行是参数的自赋值 minute=minute;//给定,因此实际上什么也不做! todo=td;//但是,这是可以的,因为没有歧义。 } 要解决此问题,请添加对目标的显式this->引用:

无效记录::setDataint小时,int分钟,const字符*td { 这个->小时=小时; 这->分钟=分钟; todo=td; } 或者更好,在我看来,给前两个参数起个不含糊的名字:

无效记录::setDataint以小时为单位,int以分钟为单位,const char*td { 小时=以小时为单位; 分钟=以分钟为单位; todo=td; } 一个问题是,具有三个参数的Record::setData函数实际上没有设置类对象的小时和分钟字段!这是因为您使用了与类成员同名的参数,这是一种糟糕的编码风格。因此,在下面的代码中,前两个赋值只是将参数值替换为它们自己:

无效记录::setDataint小时,int分钟,const字符*td { hour=hour;//这一行和下一行是参数的自赋值 minute=minute;//给定,因此实际上什么也不做! todo=td;//但是,这是可以的,因为没有歧义。 } 要解决此问题,请添加对目标的显式this->引用:

无效记录::setDataint小时,int分钟,const字符*td { 这个->小时=小时; 这->分钟=分钟; todo=td; } 或者更好,在我看来,给前两个参数起个不含糊的名字:

无效记录::setDataint以小时为单位,int以分钟为单位,const char*td { 小时=以小时为单位; 分钟=以分钟为单位; todo=td; }
另一个错误在这里

void List::printList()
{
    for (int i = 0; i < actualRecordCount; i++)
    {
        recordArr[i].printRecord();
        cout << endl;
        i++;
    }

}

您有两次i++。

另一个错误在这里

void List::printList()
{
    for (int i = 0; i < actualRecordCount; i++)
    {
        recordArr[i].printRecord();
        cout << endl;
        i++;
    }

}

你有两次i++。

但这不是std::vector。这是一个记录对象的c数组……但这不是std::vector。这是一个记录对象的c数组…@Reno这是调试器的用途。@Reno这是调试器的用途。