【问题标题】:C++ - iterating through array of pointers causes errorsC++ - 遍历指针数组会导致错误
【发布时间】:2020-02-04 02:12:04
【问题描述】:

所以我有两个课程 - Dvd 和 DvdGroup。 DvdGroup 基本上管理一组 dvd 并为该类提供可操作的成员函数。我正在努力弄清楚如何遍历 C++ 中的指针数组。基本上对于 DvdGroup 函数,它应该是执行 dvd 组的深层复制的复制构造函数。它的目的是调用 Dvd 复制构造函数来创建每个 Dvd 对象的副本。

但是,当我尝试这样做时,我得到了一些错误

DvdGroup.cc: In copy constructor ‘DvdGroup::DvdGroup(DvdGroup&)’:
DvdGroup.cc:18:43: error: no matching function for call to ‘Dvd::Dvd(Dvd*&)’
   Dvd newDvd(dvds.dvdCollection[i]);

In file included from DvdGroup.h:5:0,
                 from DvdGroup.cc:5:
Dvd.h:10:5: note: candidate: Dvd::Dvd(Dvd&)
     Dvd(Dvd&);
     ^~~~~
Dvd.h:10:5: note:   no known conversion for argument 1 from ‘Dvd*’ to ‘Dvd&’
Dvd.h:8:5: note: candidate: Dvd::Dvd(std::__cxx11::string, int)
     Dvd(string, int);
     ^~~~~
Dvd.h:8:5: note:   candidate expects 2 arguments, 1 provided
DvdGroup.cc:19:24: error: cannot convert ‘Dvd’ to ‘Dvd*’ in assignment
   dvdCollection[i] = newDvd;

我的 for 循环应该做一个非常简单的任务,但我不知道我做错了什么。我想知道是否有人可以提供帮助。

DvdGroup.cc 文件:

DvdGroup::DvdGroup(DvdGroup& dvds){ 
    numDvds = dvds.numDvds;

    for(int i = 0; i < numDvds; ++i){
        Dvd newDvd(dvds.dvdCollection[i]);
        dvdCollection[i] = newDvd;
    }
}

DvdGroup.h:

#ifndef DVDGROUP_H
#define DVDGROUP_H
#define MAX_DVDS 15
#include <string>
using namespace std;

class DvdGroup
{
    public:
        DvdGroup(int);
        DvdGroup(DvdGroup&);    
        ~DvdGroup();
        void add(Dvd*);

    private: 
        Dvd* dvdCollection[MAX_DVDS];
        int numDvds;

};
#endif

来自 Dvd.cc 文件的复制构造函数:

Dvd::Dvd(Dvd& dvd){
    title = dvd.title;
    year = dvd.year;
}

【问题讨论】:

  • 为什么使用Dvd* 指针数组而不是Dvd 对象数组?为什么要使用定长数组而不是std::vector
  • 这是极具 C 风格的 C++。在 C++ 中,始终使用像 std::vector 这样的标准库容器,并转向使用 const 值而不是 #define。如果这只是崩溃了,我会检查你是否真的初始化了数组(并在析构函数中释放它),或者更好的是,把它撕掉并用std::vector&lt;Dvd&gt;替换它并永久修复那个部分。

标签: c++ arrays for-loop pointers pass-by-reference


【解决方案1】:

我假设 DVD 收藏拥有 DVD,在这种情况下,您需要通过 new 制作新副本,例如

DvdGroup::DvdGroup(DvdGroup& dvds){ 
    numDvds = dvds.numDvds;

    for(int i = 0; i < numDvds; ++i){
        dvdCollection[i] = new Dvd(*dvds.dvdCollection[i]);
    }
}

【讨论】:

    猜你喜欢
    • 2018-06-30
    • 2012-11-06
    • 2020-11-28
    • 2021-05-08
    • 2021-05-29
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多