C++ 初始化基类
据我所知,这应该行得通,不是吗C++ 初始化基类,c++,C++,据我所知,这应该行得通,不是吗 struct ViewOfFile { void* p = nullptr; ViewOfFile(HANDLE hMap, int64_t OffsetB, SIZE_T SizeB, bool WriteAccess) { DWORD ViewAccessMode = FILE_MAP_READ | (WriteAccess ? FILE_MAP_WRITE : NULL); LARGE_INTEGER LI
struct ViewOfFile {
void* p = nullptr;
ViewOfFile(HANDLE hMap, int64_t OffsetB, SIZE_T SizeB, bool WriteAccess) {
DWORD ViewAccessMode = FILE_MAP_READ | (WriteAccess ? FILE_MAP_WRITE : NULL);
LARGE_INTEGER LI = { OffsetB };
p = MapViewOfFile(hMap, ViewAccessMode, LI.HighPart, LI.LowPart, SizeB);
if (p == nullptr) throw Exception("ViewOfFile: Failed to create view.");
}
~ViewOfFile() {
if (p) UnmapViewOfFile(p);
}
operator void*() const { return p; }
operator char*() const { return reinterpret_cast<char*>(p); }
};
template <typename T>
struct ViewOfFileAs : ViewOfFile {
T* as;
ViewOfFile(HANDLE hMap, int64_t OffsetB, SIZE_T SizeB, bool WriteAccess) : ViewOfFile(hMap, OffsetB, SizeB, WriteAccess) {
as = reinterpret_cast<T*>(p);
}
};
结构视图文件{
void*p=nullptr;
视图文件(句柄hMap、int64\t OffsetB、大小SizeB、bool WriteAccess){
DWORD VIEWACCESS MODE=文件映射读取(WriteAccess?文件映射写入:NULL);
大整数LI={OffsetB};
p=MapViewOfFile(hMap、ViewAccessMode、LI.HighPart、LI.LowPart、SizeB);
if(p==nullptr)抛出异常(“ViewOfFile:未能创建视图”);
}
~ViewOfFile(){
如果(p)未提交文件(p);
}
运算符void*()常量{return p;}
运算符char*()常量{return reinterpret_cast(p);}
};
模板
结构ViewOffiles:ViewOfFile{
T*as;
ViewOfFile(句柄hMap、int64\t OffsetB、大小SizeB、bool WriteAccess):ViewOfFile(句柄hMap、OffsetB、大小SizeB、WriteAccess){
as=重新解释铸件(p);
}
};
但是,模板类构造函数给了我一个错误“只有构造函数才能有基/成员初始值设定项列表”。为什么会发生这种情况?我想你只是在模板结构的定义上有一个输入错误:你编写了
ViewOfFile
,而不是作为构造函数编写了viewoffiles
ViewOfFile(HANDLE hMap, int64_t OffsetB, SIZE_T SizeB, bool WriteAccess)
应该是
ViewOfFileAs(HANDLE hMap, int64_t OffsetB, SIZE_T SizeB, bool WriteAccess)
不相关,但为什么要使用
NULL
宏写入整数值?您可能希望将模板构造函数从ViewOfFile重命名为ViewOfFileAs@NeilKirk因为它应该是0,和另一个宏一样是紫色的,它的一个时尚Couebjar Stroustrup多次说过,在一个正确的C++程序中没有任何理由使用NULL。“时尚选择”的确如此。