我有一个抽象基类和一个空结构,应在此类内部使用
//base.hpp
class Base {
public:
virtual void do_something(const char* arr) {
h = reinterpret_cast<Header*>(arr); //What happens here in the derived class? I would want it to cast it to the respective derived struct
h->val = 10 //these are some common functionalities which I want to include in the base class
}
private:
Header *h;
}
//header.hpp
struct Header {
}
class和struct都是继承的
//derivedA.h
class DerivedA : public Base {
...
//this class should refer to HeaderA
}
//header.hpp
struct HeaderA : public Header{
int val;
bool is_it;
}
类似地,还有另一个派生类DerivedB及其关联的HeaderB。 如何使派生类引用其各自的派生结构?
即使基本成员很少,我却拥有空的基本结构的原因之一是我正在使用reinterpret_cast
。输入缓冲区中的公共成员的排列方式不同。但是在基类中定义通用功能很有用。我在这里想念什么?我该如何工作?
答案 0 :(得分:1)
0)在char *上使用reinterpret_cast是一个非常糟糕的主意。更改您的基本构造函数以使用Header指针。或者不这样做,因为他们没有共享任何东西,没有真正的理由在这里使用继承。
为了清楚起见,也许您在基本Header中遗漏了很多东西,我不知道。但是按照书面规定,您不需要首先使用基本标头指针。
1)使HeaderA从Header继承。
2)DerivedA的构造函数采用HeaderA *参数,然后将其传递给基类的基于Header *的构造函数。
3)DerivedA使用正确的类型保留传入内容的单独副本。
类似
var file = new FileInfo(@"C:\Very.Large.Array.json");
using (var sr = new StreamReader(file.OpenRead()))
using (var reader = new JsonTextReader(sr))
{
while (reader.Read())
{
if (reader.TokenType == JsonToken.StartObject)
{
var obj = JObject.Load(reader);
var rawJSON = obj.ToString();
}
}
}
请注意,此处完全不解决HeaderA的所有权。您可能想在基类中使用class Base {
public:
virtual ~Base() {} // virtual base destructor! Very important.
Base(Header* foo)
: header(foo) {
}
private:
Header* header;
...
};
// at the very least, you probably want a virtual destructor here too
struct Header {
virtual ~Header() {}
};
struct HeaderA : public Header {
...
};
class DerivedA : public Base {
public:
DerivedA(HeaderA* header) :
: Base(header)
, headerA(header)
{
...
}
private:
HeaderA* headerA;
};
,并让RAII在其他任何地方为您处理它……而不是像上面代码中那样使用引用。然后,即使标头完全为空,至少也要在基类中添加它。
返回从std::unique_ptr<Header>
到char*
的转换。我想您正在使用Header*
或类似的标题将其写到文件,数据包或类似文件中,以提高效率。
不要。
在我研究过的两个AAA MMORPG代码库中,每个结构的每个字段都被明确地写出(写到数据包或文件中)。在某些情况下,它可能像过于冗长的memcpy()
一样工作,但是我们付出了努力,因为安全性值得额外努力。如果您继续按照自己的方式进行操作,则标头中的所有内容都必须正确存在。
通过单独写出字段,您可以执行
之类的操作