gpt4 book ai didi

c++ - 我可以从我的父类(super class)中调用子类构造函数吗?

转载 作者:太空宇宙 更新时间:2023-11-04 12:34:25 25 4
gpt4 key购买 nike

我想知道是否可以通过父类(super class)的重载运算符返回子类对象。

#include <stdio.h>
#include <iostream>
using namespace std;

struct AndSpecification;

struct Specification{
virtual bool is_satisfied(int i) = 0;



AndSpecification operator&& (Specification & other){
return AndSpecification(*this, other);
}

};


struct Specification1 : Specification{
int k;
Specification1(int k) : k(k){}

bool is_satisfied(int i){
if (i > k)
return true;
return false;
}

};

struct Specification2 : Specification{
int k;
Specification2(int k) : k(k){}

bool is_satisfied(int i){
if (i < k)
return true;
return false;
}
};

struct AndSpecification : Specification{
Specification& first;
Specification& second;

AndSpecification(Specification& first, Specification& second) : first(first), second(second){}

bool is_satisfied(int i) override{
return first.is_satisfied(i) && second.is_satisfied(i);
}
};

我认为结果是我不能使用我的子类的构造函数,因为它还没有定义。错误信息是:

main.cpp: 在成员函数‘AndSpecification Specification::operator&&(Specification&)’中:

main.cpp:20:56: 错误:返回类型‘struct AndSpecification’不完整 AndSpecification operator&& (Specification & other){ ^

main.cpp:21:45: 错误:不完整类型“struct AndSpecification”的使用无效 返回 AndSpecification(*this, other);

最佳答案

在完全定义类之前,不能以这种方式使用不完整的前向类声明。在某些情况下可以使用不完整(前向)类声明,但这不是其中之一。

C++ 编译器按顺序从头到尾读取源代码。当它看到你的运算符(operator)时,它不知道这个神秘的类是什么,它正在返回。它尚未被定义。它只是稍后在头文件/源文件中定义。

您需要声明类方法,然后仅在它返回的类完全定义后才定义它:

// ...

struct Specification{
virtual bool is_satisfied(int i) = 0;



AndSpecification operator&& (Specification & other);

};

// After AndSpecification is declared, later:

inline AndSpecification Specification::operator&& (Specification & other){
return AndSpecification(*this, other);
}

作为 inline 的替代方法,将运算符方法的定义放入其中一个翻译单元中。

关于c++ - 我可以从我的父类(super class)中调用子类构造函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57027567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com