2013-02-22 154 views
2

我一直在尝试创建一个类的层次结构,让每个类都包含一个包含数据的嵌套结构。指向对象类型的指针

////////Class.h//////////////////////////// 
#ifndef _CLASS_H_ 
#define _CLASS_H_ 
#include <stdio.h> 

class A{//Base 
    protected: 
    struct dataA{ 
     int v1, v2; 
    }; 
    public: 
    A(); 
    virtual void met1(); 
    dataA * const set; 
    const dataA * const get; 
}; 

class B : public A{//Child1 
    protected: 
    struct dataB : public dataA{ 
     int v3, v4; 
    }; 
    public: 
    B(); 
    virtual void met2(); 
    dataB * const set; 
    const dataB * const get;  
}; 

class C : public B{//Child2 
    struct dataC : public dataB{ 
     int v5, v6; 
    }; 
    public: 
    C(); 
    void met3(); 
    dataC * const set; 
    const dataC * const get; 
}; 
#endif 
////////Class.cpp/////////////////////////// 
#include "Class.h" 

A::A() : set(new dataA), get(set) { 
    this->set->v1 = -1; 
    this->set->v2 = -1; 
} 

void A::met1() { 
    printf("%i, %i", this->get->v1, this->get->v2);//PRINTS "-1, -1" 
} 

B::B() : A(), set(new dataB), get(set) { 
    this->set->v3 = -1; 
    this->set->v4 = -1; 
} 

void B::met2() { 
    printf("%i, %i", this->get->v1, this->get->v2);//An attempt to access C's "get" variable, PRINTS "-1, -1" 
} 

C::C() : B(), set(new dataC), get(set) { 
    this->set->v5 = -1; 
    this->set->v6 = -1; 
} 

void C::met3() { 
    printf("%i, %i", this->get->v1, this->get->v2);//PRINTS "2, 3" 
} 
///////main.cpp//////////////////////////////// 
#include "Class.h" 

int main() { 
    C memb; 
    memb.set->v1 = 2; 
    memb.set->v2 = 3; 
    printf("%i, %i", memb.get->v1, memb.get->v2);//PRINTS "2, 3" 
    memb.met2();//PRINTS "-1, -1" 
    return 0; 
} 

enter image description here 所以,我一直在努力做的就是声明C类型的成员,从B的访问到C的数据结构访问继承功能之后。 void指针不会完成这项工作,因为它不能指向对象类型。我试过把C的地址传给B,但是,它们都是不同的类型。首先,如果我从主块访问v1,假设我已经为它设置了一个值,如示例所示,我得到一个正确的值 - 我设置的值。但是,如果我尝试访问同一个变量,但是从类B中取而代之,它将打印该值,就像它以前没有设置过一样,除了构造函数之外。所以我试图创建一个从类B到类C的数据结构的链接 - 到类C的数据父类B的数据结构。示例代码尚未编译。 关心!

+0

也许代码编译可能的帮助。在A :: dataA中不存在数据成员'var1',所以在printf语句中取消引用this-> get-> var1'是无效的。这不是唯一的问题(显然)。 – WhozCraig 2013-02-22 22:12:17

+0

@WhozCraig我相信现在应该没问题了 – user203432 2013-02-22 22:23:40

+0

你确实意识到你对“打印-1,-1”的评论是不正确的,对吧?我对你想要达到的目标以及你的实际问题有些困惑。 – 2013-02-22 22:25:06

回答

2

我敢肯定,这是接近你想要的,但我必须告诉你,我需要在写完后淋浴。有一吨的东西,这个我不会做,但是......

#include <cstdio> 
#include <cstdlib> 
using namespace std; 

class A{//Base 
protected: 
    struct dataA 
    { 
     int v1, v2; 
    } * const data; 

    A(dataA* const p) 
     : data(p) 
    { 
     p->v1=-1; 
     p->v2=-1; 
    }; 

public: 
    virtual void met1() 
    { 
     printf("%i, %i", get()->v1, get()->v2); 
    } 

    const dataA * const get() const { return data; } 
    dataA * const set() const { return data; } 
}; 

class B : public A {//Child1 
protected: 
    struct dataB : public dataA 
    { 
     int v3, v4; 
    } * const data; 

    // protected constructor 
    B(dataB * const p) 
     : A(p), data(p) 
    { 
     p->v3 = 0; 
     p->v4 = 0; 
    }; 

public: 
    virtual void met2() 
    { 
     printf("%i, %i, %i, %i", get()->v1, get()->v2, get()->v3, get()->v4); 
    } 

    const dataB * const get() const { return data; } 
    dataB * const set() const { return data; } 
}; 

class C : public B 
{ 
    struct dataC : public dataB 
    { 
     int v5, v6; 
    } * const data; 

public: 
    C() : B(new dataC), 
    data(static_cast<dataC*>(B::data)) 
    { 
     data->v5 = 0; 
     data->v6 = 0; 
    }; 

    ~C() 
    { 
     // note, the pointers in B and A are left 
     // dangling after this is done. 
     delete data; 
    } 

    virtual void met2() 
    { 
     printf("%i, %i, %i, %i, %i, %i", 
       get()->v1, get()->v2, 
       get()->v3, get()->v4, 
       get()->v5, get()->v6); 
    } 

    const dataC * const get() const { return data; } 
    dataC * const set() const { return data; } 
}; 


///////main.cpp//////////////////////////////// 

int main() { 
    C memb; 
    memb.set()->v1 = 2; 
    memb.set()->v2 = 3; 
    printf("%i, %i\n", memb.get()->v1, memb.get()->v2); 
    memb.met2(); 
    return 0; 
} 

输出


更新

OP想看看这个不get()和set()成员只使用成员变量。再次,只是可怕的,但在这里你去:

#include <cstdio> 
#include <cstddef> 

class A{//Base 
protected: 
    struct dataA 
    { 
     int v1, v2; 
    }; 
    dataA * const set; 
    const dataA * const get; 

    A(dataA* const p) 
     : get(p), set(p) 
    { 
     p->v1=-1; 
     p->v2=-1; 
    }; 

public: 
    virtual void met1() 
    { 
     printf("%i, %i\n", get->v1, get->v2); 
    } 
}; 

class B : public A {//Child1 
protected: 
    struct dataB : public dataA 
    { 
     int v3, v4; 
    }; 
    dataB * const set; 
    const dataB *const get; 


    // protected constructor 
    B(dataB * const p) 
     : A(p), set(p), get(p) 
    { 
     p->v3 = 0; 
     p->v4 = 0; 
    }; 

public: 
    virtual void met2() 
    { 
     printf("%i, %i, %i, %i\n", get->v1, get->v2, get->v3, get->v4); 
    } 
}; 

class C : public B 
{ 
    struct dataC : public dataB 
    { 
     int v5, v6; 
    }; 
public: 
    dataC * const set; 
    const dataC * const get; 

    C() : B(new dataC), 
     set(static_cast<dataC *const>(B::set)), 
     get(static_cast<const dataC *const>(B::get)) 
    { 
     set->v5 = 0; 
     set->v6 = 0; 
    } 

    ~C() 
    { 
     // note, the pointers in B and A are left 
     // dangling after this is done. 
     delete set; 
    } 

    virtual void met2() 
    { 
     printf("%i, %i, %i, %i, %i, %i\n", 
       get->v1, get->v2, 
       get->v3, get->v4, 
       get->v5, get->v6); 
    } 
}; 


///////main.cpp//////////////////////////////// 

int main() { 
    C memb; 

    memb.set->v1 = 2; 
    memb.set->v2 = 3; 

    printf("%i, %i\n", memb.get->v1, memb.get->v2); 
    memb.met2(); 

    B& obj = memb; 
    obj.met1(); 
    obj.met2(); 

    return 0; 
} 

输出

2, 3 
2, 3, 0, 0, 0, 0 
2, 3 
2, 3, 0, 0, 0, 0 
+0

中引用(this)非常感谢!但是,是否有一种方法可以简化语法并使用set和get变量? – user203432 2013-02-22 23:08:59

+1

@ user203432是的,但它会更可怕。 – WhozCraig 2013-02-22 23:10:47

+0

唉,好吧,谢谢,无论如何,猜猜这会做。这个小细节一直困扰着我,也许现在已经有一两个星期了,很高兴这有一部分是:) – user203432 2013-02-22 23:12:29

相关问题