想象一下这样的假设情景。
我已经创建了两个相互独立的类Boolean
和String
(包括它们各自的方法和属性)。
当调用其中的某个方法(比如说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 ++代码?
感谢您通读(并提供帮助)。
答案 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
类将拥有哪些构造函数。