声明类以解决不完整类型错误的无效使用

时间:2018-12-07 17:27:51

标签: c++

我是c ++的新手,正在尝试使用两个.hpp文件cpScalar.hpp和cpVector.hpp进行计算。在阅读前向声明说明时,我遇到了困难-我发现所有解决方案都说我不能在完全“声明类”之前使用另一个标头中另一个类的方法,而且我不知道要完全“做什么”声明/定义“该类。

为澄清起见,cpVector依赖于cpScalar,反之亦然-需要循环依赖

我正计划使用cpScalar在cpVector中获取cpScalar的数组,但是由于我未声明,所以无法访问参数输入'cpScalar sarr []',并且我正在使用不完整类型错误。我想知道本节需要做什么。

我不打算在构造函数中使用指针代替向量,因为这会导致灵活的数组问题,(似乎)使用我在课堂上没有学到的'struct'和'malloc'来解决。

下面是我的代码:

// cpVector
#ifndef CPVECTOR_HPP
#define CPVECTOR_HPP
#include <iostream>
#include <vector>
#include "cpScalar.hpp"

using namespace std;

class cpScalar;

class cpVector{
private:
    vector<cpScalar> arr; // cpScalar* arr; seems to be more complicated...
    unsigned int size;

public:
    cpVector(cpScalar sarr[], unsigned int size2){ // this constructor is given
        this->size = size2;
        arr.resize(size);
        for (int i =0; i<size; i++){
            arr[i] = sarr[i]; // this gives incomplete type error
        }
        };
... more public functions...

#endif



#ifndef CPSCALAR_HPP
    #define CPSCALAR_HPP
    #include <iostream>
    #include <string>
    #include "cpVector.hpp"

using namespace std;

class cpVector;

class cpScalar{
private:
    int intScalar;
    double doubScalar;


public:
    cpScalar(int num){
        intScalar = num;
    };

    cpScalar(double num){
        doubScalar = num;
    };

2 个答案:

答案 0 :(得分:0)

如果您是C ++的新手,则前向声明可能会使您感到困惑。您需要了解编译器如何读取文件以及如何确定文件之间的链接。

如果这是cpScalar.hpp的全部代码,则无需包含cpVector.hpp。这是因为您没有实例化或使用该文件中的类。 现在,这两个类之间具有循环依赖关系。 cpVector.hpp包含cpScalar.hpp,然后cpScalar.hpp包含cpVector.hpp。编译器是您的朋友,对他/她很轻松。

答案 1 :(得分:0)

  

为澄清起见,cpVector依赖于cpScalar,反之亦然-需要循环依赖

我没有理由相信这一点。您可能认为需要循环依赖,但不是必需的。考虑一下您如何学习这些概念。您可能在上学之前就已经了解了标量(以计数的形式)。另一方面,矢量往往是基于您对标量的了解(在高中或几年前?)建立的更高级的主题。

程序中的结构可能类似:标量应自行定义,而向量应基于标量。当向量和标量交互时(例如将向量乘以标量),定义应属于更“高级”的类,即cpVector。不需要循环依赖。