class SuperClass{
/* ==================== METHODS ======================================= */
void
setValue (
std::string name,
int i) {
MemberMapIterator it = memberMap_.find (name);
if (it != memberMap_.end ()) {
void* ptr = (*it).second;
long long classPtr = reinterpret_cast< long long > (this);
long long memberPtr = reinterpret_cast< long long > (ptr);
int* value = reinterpret_cast< int* > (classPtr + memberPtr);
(*value) = i;
}
} // setValue
int
getValue (
std::string name) {
MemberMapIterator it = memberMap_.find (name);
if (it != memberMap_.end ()) {
void* ptr = (*it).second;
long long classPtr = reinterpret_cast< long long > (this);
long long memberPtr = reinterpret_cast< long long > (ptr);
int* value = reinterpret_cast< int* > (classPtr + memberPtr);
return *value;
}
return -234234;
} // getValue
protected:
/* ==================== METHODS ======================================= */
void
Build () {
configure ();
} // Build
void
AddMember (
std::string name,
void* ptr) {
memberMap_.insert (MemberMapPair (name, ptr));
} // AddMember
/* ==================== STATIC METHODS======================================= */
virtual void
configure () = 0;
private:
/* ==================== METHODS ======================================= */
/* ==================== DATA MEMBERS ======================================= */
MemberMap memberMap_;
};
class SubClass: public SuperClass {
public:
/* ==================== LIFECYCLE ======================================= */
SubClass() : age_ (0) {
Build ();
} /* constructor */
~SubClass() /* destructor */
{ }
protected:
/* ==================== STATIC METHODS======================================= */
void
configure () {
long long classPtr = reinterpret_cast< long long > (this);
long long agePtr = reinterpret_cast< long long > (&this->age_);
void* ptr = reinterpret_cast< void* > (agePtr - classPtr);
this->AddMember ("age", ptr);
} // configure
private:
/* ==================== DATA MEMBERS ======================================= */
int age_;
}
在SubClass中,我使用字符串名稱作爲key添加了私有類字段的偏移量(將類想爲C結構)。我將使用僅執行配置一次,然後我想使用這個偏移量爲每個Person實例訪問其運行時的私人字段(this + offset = field)。這會安全嗎?我測試了這個代碼和它正在做我想做的工作。但是,我應該期待任何內存違規或其他事情(假設它不會有意違反(程序員錯誤))?C++運行時字段訪問
爲什麼地球上你甚至想要做一件這樣糟糕的事情呢? –
兩個指針的區別是**不是**指針。除此之外,你真的想在這裏做什麼?編譯器很高興爲你匹配 –
爲什麼你不能這樣做:this-> AddMember(「age」,&(this-> age_)); – imreal