C++ 为什么这些课程不完整?

C++ 为什么这些课程不完整?,c++,oop,C++,Oop,我有一个来源。C: #include "image.h" #ifndef SOURCE_H #define SOURCE_H class Source { private: Image* img; public: virtual void Execute()=0; Image* GetOutput(); }; #endif Image* Source::GetOutput() { return this->im

我有一个来源。C:

#include "image.h"

#ifndef SOURCE_H
#define SOURCE_H

class Source
{
    private:
        Image* img;
    public:
        virtual void Execute()=0;
        Image* GetOutput(); 
};
#endif

Image* Source::GetOutput()
{
    return this->img;
}
还有一个水槽

#include "image.h"


#ifndef SINK_H
#define SINK_H
class Sink
{
    private:
        Image* img1;
        Image* img2;

    public:
        void SetInput(Image* input1);
        void SetInput2(Image* input2);
};
#endif

void Sink::SetInput(Image* input1)
{
    this->img1 = input1;
}

void Sink::SetInput2(Image* input2)
{
    this->img2 = input2;
}
我有一个要从源和接收器继承的筛选器.h:

#include "image.h"
#include <iostream>
#include <stdlib.h>

class Source;
class Sink;

class Filter : Source, Sink
{
    public:
        Filter() {std::cout << "Constructing filter." << std::endl;}
};
#包括“image.h”
#包括
#包括
类源;
类水槽;
类筛选器:源、接收器
{
公众:
Filter(){std::cout转发声明只让编译器知道名称存在,但它不告诉任何有关名称定义的信息。为了继承,必须知道基类的定义。必须在Filter.h中包含标头,以便编译器可以看到父类的定义

编辑

声明意味着名称存在,定义意味着名称的外观。对于类定义,它意味着类包含的内容、成员、大小等。当一个类被另一个类继承时,编译器会将基类的成员放在派生类中。因此,它必须知道基类的外观。通过包含头wh在定义基类之前,编译器实际上会将定义放在包含的文件中,因此它知道基类


正如其他人指出的,关于你的私人继承权,我建议你阅读关系,这里有两个问题

第一,正如其他人提到的,您需要包括Sink和Source的头。目前您只有一个forward声明,它允许您使用指针,但不允许从中派生或实例化。编译器不知道大小,也不知道它提供了什么方法,也不知道如何构造

第二个问题是,一旦包含了头,就会遇到这个问题:Sink类中有一个纯虚函数,这使得它成为一个抽象基类。
您需要从中派生(您有)并在派生类中实现Execute方法(您没有)

这是因为在您的
filter.h
中您给出了一个不完整的声明:

class Source;
class Sink;
但不定义它们。编译器需要知道两者的大小,以便在以下情况下计算
过滤器的大小:

class Filter : Source, Sink
{
    public:
        Filter() {std::cout << "Constructing filter." << std::endl;}
};
类过滤器:源、接收器
{
公众:
筛选器(){std::cout
应该会帮你解决的

此外,这一行:
类过滤器:源、接收器

这是私有继承,这几乎总是您不想要的(您将无法以多态方式使用该类)

您可能需要将此更改为


类过滤器:公共源、公共接收器

定义是什么意思?它们是类?@user3668005,声明意味着名称存在,定义意味着名称的外观。对于类定义,它意味着类包含的内容、成员、大小等。好的,这是有意义的。事实证明,它们是我的项目目前没有头文件。我不知道没有头文件会影响这一点。
#include "sink.h"
#include "source.h"