C++ 函数解析基 class 指针到派生 class 指针
C++ function resolving base class pointer to derived class pointer
我尝试用指针实现类似于 JSON
的东西作为考试问题的一部分,但我最终遇到了一个我不知道如何解决的错误。
我有这些 classes(省略了实现,因为我认为这对我的错误并不重要):
struct JSON_BaseObject;
template<typename J_Type>
struct JSON_Value : public JSON_BaseObject;
struct JSON_String : public JSON_Value<std::string>;
struct JSON_Number : public JSON_Value<double>;
struct JSON_Null : public JSON_BaseObject;
using JSON_Children = std::map<std::string, JSON_BaseObject*>;
using JSON_Object = JSON_Value<JSON_Children>;
而且我想使用 JSON_Object
中 JSON_BaseObject*
类型的子代作为对这些派生类型具有不同重载的函数的参数,所以我制作了这些函数并希望它们能够解决JSON_BaseObject*
到相应的 class (指针):
void print(JSON_Null*, std::ostream& os);
void print(JSON_String* str, std::ostream& os);
void print(JSON_Number* number, std::ostream& os);
void print(JSON_Object* object, std::ostream& os);
当我 运行 它时,我得到一个 运行 时间错误,程序无法找到函数 print(JSON_BaseObject*, std::ostream&)
我意识到我不是正如我所想的那样擅长 C++。
问题 1
是否可以像这样从基class解析指针类型参数?
问题 2
我怎样才能让它变得更好,例如开始能够在不知道 obj
?
的派生 class 的情况下使用 print(obj, os);
在尝试了 visitor 模式后,我意识到它解决了我所有的问题。它还以简单的方式解析基指针。
它启用了这样一个不错的代码:
int main()
{
JSON_Object obj = JSON_Object();
JSON_String str = JSON_String("I am a string!");
std::vector<JSON_Base*> basePtrs
{
&obj,
&str
};
Printer printer;
for (auto json : basePtrs)
{
json->PrintMe(printer);
}
}
我尝试用指针实现类似于 JSON
的东西作为考试问题的一部分,但我最终遇到了一个我不知道如何解决的错误。
我有这些 classes(省略了实现,因为我认为这对我的错误并不重要):
struct JSON_BaseObject;
template<typename J_Type>
struct JSON_Value : public JSON_BaseObject;
struct JSON_String : public JSON_Value<std::string>;
struct JSON_Number : public JSON_Value<double>;
struct JSON_Null : public JSON_BaseObject;
using JSON_Children = std::map<std::string, JSON_BaseObject*>;
using JSON_Object = JSON_Value<JSON_Children>;
而且我想使用 JSON_Object
中 JSON_BaseObject*
类型的子代作为对这些派生类型具有不同重载的函数的参数,所以我制作了这些函数并希望它们能够解决JSON_BaseObject*
到相应的 class (指针):
void print(JSON_Null*, std::ostream& os);
void print(JSON_String* str, std::ostream& os);
void print(JSON_Number* number, std::ostream& os);
void print(JSON_Object* object, std::ostream& os);
当我 运行 它时,我得到一个 运行 时间错误,程序无法找到函数 print(JSON_BaseObject*, std::ostream&)
我意识到我不是正如我所想的那样擅长 C++。
问题 1
是否可以像这样从基class解析指针类型参数?
问题 2
我怎样才能让它变得更好,例如开始能够在不知道 obj
?
print(obj, os);
在尝试了 visitor 模式后,我意识到它解决了我所有的问题。它还以简单的方式解析基指针。
它启用了这样一个不错的代码:
int main()
{
JSON_Object obj = JSON_Object();
JSON_String str = JSON_String("I am a string!");
std::vector<JSON_Base*> basePtrs
{
&obj,
&str
};
Printer printer;
for (auto json : basePtrs)
{
json->PrintMe(printer);
}
}