如何在C ++中修复“无效使用不完整类型”

时间:2019-09-06 21:09:16

标签: c++ oop friend friend-function

我想通过使用一个班级的方法在2个班级之间建立友谊。即使我研究了不同的教程和书籍,也无法使它起作用。

修改 :: 它可以在一个文件中工作,但我想在单独的文件中进行-不幸的是无法做到这一点:

Tbase_in_memory.h:

#ifndef FRENDY_TBASE_IN_MEMORY_H
#define FRENDY_TBASE_IN_MEMORY_H

#include <iostream>
#include <string>
#include <fstream>

class base;

class Tbase_in_memory
{
public:
    Tbase_in_memory(int = 2);
    ~Tbase_in_memory();
    void read_to_arrays(base & b);

private:
    std::string *name;
    double      *price_tag;
    int         *code;
    char        *type;
    int         _size;
};

#endif

Tbase_in_memory.cpp:

#include "Tbase_in_memory.h"

using namespace std;

class base;
Tbase_in_memory::Tbase_in_memory(int s)
{
    _size = s;
    name = new string[_size];
    price_tag = new double[_size];
    code = new int[_size];
    type = new char[_size];
}

Tbase_in_memory::~Tbase_in_memory()
{
    delete[] name;
    delete[] price_tag;
    delete[] code;
    delete[] type;
}

void Tbase_in_memory::read_to_arrays(base & b)
{
    string line;
    while (getline(b.file, line)) {
        cout << line;
    }
}

base.h:

#ifndef FRENDY_BASE_H
#define FRENDY_BASE_H

#include <iostream>
#include <string>
#include <fstream>
#include "Tbase_in_memory.h"

class base
{
public:
    base(std::string = "...");
    ~base();
    friend void Tbase_in_memory::read_to_arrays(base & b);
private:
    std::fstream    file;
    std::string     f_name;
};

#endif

base.cpp

#include "base.h"

using namespace std;

base::base(string n)
{
    f_name = n;
    file.open(f_name, ios::in);

    if (!file.good()) {
        cout << "Error";
        cout << string(38, '-');
        exit(0);
    }
}

base::~base()
{
    file.close();
}
#include <iostream>
#include "Tbase_in_memory.h"
#include "base.h"

using namespace std;

int main()
{
    base b("/home/Sempron/Desktop/code");
    Tbase_in_memory a;
    a.read_to_arrays(b);
    return 0;
}

我遇到了错误:

"error: invalid use of incomplete type ‘class base’
     while (getline(b.file, line)) {". 

"forward declaration of ‘class base’
     class base;"

2 个答案:

答案 0 :(得分:1)

在声明new CustomBusinessLogic.Calculator引用时,必须存在被赋予友谊访问权限的函数的原型/定义。固定代码(包含):

friend

理想情况下,这两个类将在不同的头文件中声明,因此您必须仔细观察包含顺序。

答案 1 :(得分:1)

在文件Tbase_in_memory.cpp中,您还需要包括base.h。然后,您可以在cpp文件中删除前向声明。

#include "Tbase_in_memory.h"
#include "base.h"

using namespace std;

Tbase_in_memory::Tbase_in_memory(int s)
{
    //...