指针和指向类数据成员的指针的抽象
Abstraction of pointer and pointer to class data member
我想你们很多人都熟悉类数据成员指针的用法。最常见的用法是当你有一个对象列表,并且用一个只知道数据成员的相对偏移量的函数处理它们时。
我有一个嵌套结构,在注册时,我只知道内部结构(b)相对于父结构(a)的相对偏移量。全局结构实例(a)尚未实例化。
在程序中的某个时刻,a将被实例化,并且所有数据成员(包括子结构(b))将与全局结构的绝对位置绑定。
请参见下面的示例
struct A {
int a1;
int a2;
struct B {
int b1;
int b2;
}b;
}
descA.register(&A::a1,"a1");
descA.register(&A::a2,"a2");
descA.register(&A::b,descB);
...
descB.register(&B::b1,"b1");
descB.register(&B::b2,"b2");
A a; // create instance of nested struct
descA.bind(a);
// a1,a2,b requires the base pointer of a
// b1,b2 requires the base pointer of b
现在,我想抽象一个指针的概念,因为我有一个简单的绝对引用是A*
,我有一个指向内部struct B
的指针,我想通过隐藏(aptr->*b_rel_ptr)
在指针类中的差异来生成B*
。
总的来说,经过深思熟虑后,我需要为这个指针类提供三个独立的接口。
- 我需要能够分配一个val字符串的指针指向的位置
- 如果基指针尚未设置,则需要设置指针对象的基指针
- 我需要定义结构指针的概念,这样我就可以将基指针传播给它的所有成员
这些将是我需要的具体指针类:
- 绝对结构指针——一个全局结构指针
- 相对结构指针—结构 内部的结构指针
- 相对值指针——结构体 中的值指针
- 绝对值指针——一个值的位置已经已知的值指针
一旦我能够定义这个指针抽象的接口。我能够实现我所需要的,没有太多的麻烦。
////////////////////////////////////////////////////////////////////////////////
// Pointer abstraction
////////////////////////////////////////////////////////////////////////////////
// interfaces
class Reference {
public:
virtual ~Reference() {}
virtual void assign(std::string val) = 0;
};
template<typename BT>
class BasePtr {
public:
virtual void setBase(BT* ptr) = 0;
virtual bool isBaseSet() { return false; }
};
template<typename ST>
class StructPtr {
public:
virtual void addPtr(BasePtr<ST>* ptr) = 0;
virtual void notify() = 0;
};
// implementation
template<typename T>
class AbsStructPtr : public Reference,
public BasePtr<T>,
public StructPtr<T> {
public:
AbsStructPtr() {}
~AbsStructPtr() {}
void assign(std::string val) {
throw std::runtime_error("struct pointer: cannot assign to struct");
}
void setBase(T* p) {
ptr = p;
}
void addPtr(BasePtr<T>* ptr) {
pointers.push_back(ptr);
}
void notify () {
for(size_t i=0; i<pointers.size(); i++) {
pointers[i]->setBase(ptr);
}
}
protected:
T* ptr;
typedef std::vector<BasePtr<T>*> PointerVec;
PointerVec pointers;
};
template<typename T, typename PT>
class RelStructPtr : public Reference,
public BasePtr<PT>,
public StructPtr<T> {
public:
RelStructPtr(T PT::*ptr) : memptr(ptr), baseptr(NULL) {}
~RelStructPtr() {}
void assign(std::string val) {
throw std::runtime_error("struct pointer: cannot assign to struct");
}
void setBase(PT* p) {
baseptr = p;
}
void addPtr(BasePtr<T>* ptr) {
pointers.push_back(ptr);
}
void notify () {
T* ptr = &(baseptr->*memptr);
for(size_t i=0; i<pointers.size(); i++) {
pointers[i]->setBase(ptr);
}
}
protected:
T PT::*memptr;
PT* baseptr;
typedef std::vector<BasePtr<T>*> PointerVec;
PointerVec pointers;
};
template<typename T, typename PT>
class RelValPtr : public Reference,
public BasePtr<PT> {
public:
RelValPtr(T PT::*ptr) : memptr(ptr), baseptr(NULL) {}
~RelValPtr() {}
void assign(std::string val) {
assigner.assign(val);
}
void setBase(PT* p) {
baseptr = p;
}
protected:
T PT::*memptr;
PT* baseptr;
Assigner<T> assigner;
};
template<typename T>
class AbsValPtr : public Reference,
public BasePtr<T> {
public:
AbsValPtr(T* ptr) : valptr(ptr) {}
~AbsValPtr() {}
void assign(std::string val) {
assigner.assign(val);
}
void setBase(T* p) {
throw std::runtime_error("Base pointer is set");
}
bool isBaseSet() { return true; }
protected:
T* valptr;
Assigner<T> assigner;
};
相关文章:
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 两个抽象类,派生自同一个基类.如何访问从一个抽象类到另一个抽象类的指针
- 删除指向抽象类的指针向量
- 如何将抽象类指针作为Q_PROPERTY?
- 如何保存指向抽象基类的指针/引用,但在 c++ 中仍然可以复制
- 为什么我可以取消引用指向抽象类的指针?
- 指向抽象类的指针数组:指向 nullptr 或不指向 nullptr (C++)
- C++ abort() 在函数内的抽象类对象指针调用上
- 指向抽象模板单例类的指针向量C++?
- 抽象类和独特的指针
- 如何使用抽象类指针避免内存泄漏
- 如何从其抽象母类上的指针初始化子类?
- 如何从抽象类中删除指针
- 如何使用抽象类型的C++指针指向具体类?
- 指向模板抽象类的指针向量
- 使用抽象指针调用派生类函数
- 指针到抽象类的功能超载
- 使用抽象类时,如何正确删除指针
- 抽象类和唯一指针 c++ 错误
- 使用抽象接口C++ dll 边界 -标头中的智能指针>?叫删除?