引用不完整的类类型-C ++

时间:2018-10-15 15:34:20

标签: c++

想象一下这样的假设情景。

我已经创建了两个相互独立的类BooleanString(包括它们各自的方法和属性)。

当调用其中的某个方法(比如说Boolean)时,我需要这些类(String)中的一个来创建新的toString,而另一个({{1} })在调用其中的方法(String)时创建一个新的Boolean

代码如下:

源代码1

isEmpty

当然,这是行不通的,因为在#include <string.h> class Boolean; class String; class Boolean { bool value = false; public: Boolean(bool value) { this -> value = value; } String toString() { return String(value ? "true" : "false"); } }; class String { char* value; public: String(const char* value) { this -> value = strdup(value); } Boolean isEmpty() { return Boolean(!strcmp(value, "")); } }; 类的Boolean方法中,编译器抱怨它用于构造新对象的toString类不完整类型。

到目前为止,我能获得的最远的是下面的代码(我知道是正确的):

源代码2

String

但是,当然,如果我从编译的C ++文件运行此代码,它将使用class Boolean; class String; class Boolean { bool value = false; public: String* toString() { String* string; return string; } }; class String { char* value; public: Boolean* isEmpty() { Boolean* boolean; return boolean; } }; 打印Boolean对象的字符串值,它将返回任意且不准确的内容。

第一个源代码脚本中的概念如何转换为可运行的C ++代码?

感谢您通读(并提供帮助)。

1 个答案:

答案 0 :(得分:8)

您已经接近了,但是在为Boolean进行类实现时,它唯一知道的是在某个时候会有一个名为String的类。它对String的构造函数一无所知,因此您还不能调用它们!

相反,您可以声明类名,仅在声明其功能的同时实现这些类,然后在完全声明了两个类及其功能之后,实际上实现功能

这看起来像:

class String; //We need to know there will be a class String for Boolean declaration

class Boolean {
    bool value = false;
    public:
        Boolean(bool value) { this -> value = value; }
        //We can't implement this yet since it requires 
        // calling String functions which haven't been declared yet
        String toString(); 
};

class String {
    char* value;
    public:
        String(const char* value) { this -> value = strdup(value); }
        //This is fine to implement since Boolean is already fully declared
        Boolean isEmpty() { return Boolean(!strcmp(value, "")); }
};

//String has been declared, now we can implement this function
String Boolean::toString() { return String(value ? "true" : "false"); }

在此处查看其工作原理:ideone


您的指针示例起作用的原因是因为指针没有调用任何构造函数。创建指针唯一需要知道的是类存在。如果您尝试使用new运算符,则可能会遇到相同的问题,因为此时您不知道String类将拥有哪些构造函数。