von "struct" innerhalb Klasse auf Klassenmtehode zugreifen



  • Wie mach ich das, wenn ich eine Klasse habe, und in der Klasse befindet sich ein struct, und dieses struct wird als parameter an eine funktion übergeben, und nun will ich in der Funktion über das "struct objekt" eine methode aus der Klasse aufrufen. Mh hört sich bissel konfus an?
    Also:

    class A
    {
        public:
        struct temp
        {
           ...bla.bla.bla
        }
        inline short get_x() const {return x;}
        private:
        short x;
    }
    
    ...
    ....
    void func(A::temp &thing)
    {
         ...
         so und nun möchte ich über das Objekt "thing" "get_x()" von der Klasse A
         aufrufen, in dem sich ja auch "struct temp" beinfdet, und somit auch das
         Objekt "thing"? Irgendwie muss das doch gehen oder?
    }
    

    MfG
    Stromberg



  • Meines Wissens geht das nicht



  • Hallo

    das struct temp braucht dann einen Pointer/Referenz auf A, um die Objektverbindung herzustellen.

    bis bald
    akari



  • Mh du meinst dann sowas irgendwie?

    ...
    struct temp
    {
        A pointer;
    }
    ....
    
    A::temp()
    :pointer(*this)
    {
    
    }
    

    Oder wie würdest du das dann machen?



  • class foo
    {
    public:
        foo() : m_bar(this) {}
    
    public:
        struct bar
        {
            std::size_t data;
        public:
            const foo* get_foo() const { return parent; }
    
        private:
            const foo* parent;
            bar(const foo* parent) : parent(parent) {}
        };
        short const& get_x() const { return m_x; }
    
    private:
        short m_x;
        bar m_bar;
    };
    
    void func(const foo::bar& ref)
    {
        std::cout << ref.get_foo()->get_x() << std::endl;
    }
    

    so wäre das ganz gut. Du verhinderst, das dir jemand was an deinem parent rumfuscht und kannst aber gleichzeitig auf dein parent (class foo) zugreifen ... Muss du nur selbst wissen, ob du nen const-Zeiger nimmst oder nicht 😉



  • nunja es gäbe da noch ein weg über FIELD_OFFSET und reinterpret_cast: nicht so elegant.

    Das this in der init-liste wird aber auch ne warnung produzieren...



  • Ui ui ui, jetzt wird der Code aber langsam Hardcore, ich musst da jetzt wirklich 20mal hinschaun bis ichs gecheckt hab, hoffentlich gewöhn ich mich an sowas :D. Aber es funzt. Danke.



  • (D)Evil schrieb:

    class foo
    {
    public:
        foo() : m_bar(this) {}
    
    public:
        struct bar
        {
            std::size_t data;
        public:
            const foo* get_foo() const { return parent; }
    
        private:
            const foo* parent;
            bar(const foo* parent) : parent(parent) {}
        };
        short const& get_x() const { return m_x; }
    
    private:
        short m_x;
        bar m_bar;
    };
    
    void func(const foo::bar& ref)
    {
        std::cout << ref.get_foo()->get_x() << std::endl;
    }
    

    Kann das mal einer erklären. 😕

    Bei mir kompiliert das nicht. (Zeile 4)
    error C2248: 'foo::bar::bar': Kein Zugriff auf private Element, dessen Deklaration in der Klasse "foo::bar" erfolgte



  • Den Konstruktor von bar sollte man hier schon public machen oder du machst bar bei foo zum friend.



  • Hi,

    nur mal zur Aufklärung (und dann wird wohl auch klar, warum Dein Ansatz so nicht funktionieren kann): Ob ein struct innerhalb oder außerhalb einer Klasse deklariert ist, hat (fast) keine Auswirkungen !!

    Es ist also (fast) egal, ob Du schreibst:

    Stromberg schrieb:

    class A
    {
        public:
        struct temp
        {
        };
    };
    

    Oder

    class A
    {
    };
    
    struct temp
    {
    };
    

    Objekte der jeweiligen Klassen/structs "sehen sich" jeweils gleich gut/schlecht.
    Ergo: Was im 2. Beispiel nicht geht, geht auch im ersten nicht.

    Einzige Ausnahme: Wenn ich eine "inner class" als "private" deklariere, ist sie außerhalb der "outer class" absolut unbekannt. (Also kann ich auch außerhalb kein Objekt dieser Klasse anlagen).

    Gruß,

    Simon2.



  • Ähm ja der Konstruktor muss natürlich public sein. Hatte ich vergessen davor zu setzten(public:) ... sry ...


Anmelden zum Antworten