Klasse in Klasse definieren



  • Moin!

    class A{
    public:
        A();
        ~A();
        B Basis;
    
    private:
        class B{
            B{};
            ~B{};
        };
    };
    

    Wenn ich dann gerne die Klasse B verwenden möchte, soll es so aussehen:

    A.Basis
    

    Es soll im Projekt keine Möglichkeit geben, dass eine andere Klasse, etc auf B zugreifen oder verwendet kann. Leider wird das Kompilieren beendet, mit dem Hinweis, dass B kein Type sei.

    Danke



  • Deine Klasse B muss bekannt sein, bevor du die Benutzt. Du könntest das zum Beispiel drehen:

    class A{
    private:
        class B{
    
        };
    public:
    
        B Basis;
    
    };
    

    Außerdem bist du bei dem Konstruktor und Destruktor für B mit den Klammern durcheinander gekommen, ich glaube nicht, dass du an der Stelle geschweifte Klammern benutzen wolltest.



  • Danke.

    Manchmal ist man als Programmierer blind bei seinem eigenen Code.



  • Hier aus meinem Projekt, dass ich gerade schreibe:

    #ifndef MWSALGORITHM_H
    
    #define MWSALGORITHM_H
    
    class mwsalgorithm{
    private:
        class mwssingle {
        public:
            mwssingle();
            ~mwssingle();
            template <class X> void bubblesort(X *items,int count)
            {
                X t;
                for(int a=1; a<count; a++) {
                    for(int b=count-1; b>=a; b--) {
                        if(items[b-1] > items[b]) {
                            t = items[b-1];
                            items[b-1] = items[b];
                            items[b] = t;
                        }
                    }
                }
            }
        };
    public:
        mwsalgorithm();
        ~mwsalgorithm();
        mwssingle single;
    };
    #endif // MWSALGORITHM_H
    
    #include "mwsalgorithm.h"
    mwsalgorithm::mwsalgorithm() {}
    mwsalgorithm::~mwsalgorithm() {}
    

    Hier kam es zu einem Fehler:

    Nicht definierter Verweis auf `mwsalgorithm::mwssingle::mwssingle()'|

    Normalerweise müsste dies bekannt und sichtbar sein und definiert sein? (public?=

    Danke



  • Der vermisst due Implementierung von deinem Konstruktor oder Destruktor. Wenn du nichts darin machst, lass sie einfach ganz weg. Oder deklariere sie als Default:

    class mwsalgorithm{
    private:
        class mwssingle {
        public:
            mwssingle() = default;
            ~mwssingle() = default;
            template <class X> void bubblesort(X *items,int count)
            {
                X t;
                for(int a=1; a<count; a++) {
                    for(int b=count-1; b>=a; b--) {
                        if(items[b-1] > items[b]) {
                            t = items[b-1];
                            items[b-1] = items[b];
                            items[b] = t;
                        }
                    }
                }
            }
        };
    public:
        mwsalgorithm() = default;
        ~mwsalgorithm() = default;
        mwssingle single;
    };
    

  • Mod

    Das ist ein Linkerfehler, das hat mit der Sprache C++ und Konzepten wie der Sichtbarkeit von Methoden nichts zu tun. Du hast dein Projekt falsch gebaut. Vermutlich ist das letzte gezeigte Codestück einfach nicht Teil deines Projekts.

    Allgemein ist es jedoch höchst fragwürdig, leere Konstruktoren und Destruktoren zu definieren. Wozu soll das gut sein? In dem Fall sind sie schließlich identisch mit den automatisch erzeugten Versionen. Bloß dass man grundlos viel Optimierungspotential unterbindet, wenn man sie in einer anderen Codedatei versteckt.



  • Ich habe die Implementierung in der .cpp Datei vorgenommen?

    mwsalgorithm::mwsalgorithm() {}
    mwsalgorithm::~mwsalgorithm() {}
    

    Müsste das nicht prinzipiell ausreichen für den Compiler? 😕

    Per "= default" würde es natürlich auch gehen.



  • noname1234 schrieb:

    Ich habe die Implementierung in der .cpp Datei vorgenommen?

    mwsalgorithm::mwsalgorithm() {}
    mwsalgorithm::~mwsalgorithm() {}
    

    Müsste das nicht prinzipiell ausreichen für den Compiler? 😕

    Wenn die Datei auch übersetzt und gebunden wird ...

    noname1234 schrieb:

    Per "= default" würde es natürlich auch gehen.

    Per nichts würde es noch besser gehen.


Anmelden zum Antworten