3

いくつかのクラスを配置する方法を理解しようとしています。これは私がこれまでに得たものです...

継承階層の最上位は (当然のことながら) T:

(T.h)
namespace foo
{
    class T
    {
    public:
        virtual void method1(std::string a_parameter) = 0;
        virtual void method2() = 0;
    };
}

いくつかの追加メソッドを持つ T の 2 つのサブクラスがあります。ヘッダー ファイルは次のとおりです。

(A.h)
namespace foo
{
    class A : public T
    {
    public:
        virtual ~A() {};
        virtual void method3() = 0;
        //and a factory function
        static A* gimmeAnAyy();
    };
}

(B.h)
namespace foo
{
    class B : public T
    {
    public:
        virtual ~B() {};
        virtual void method4() = 0;
        //and a factory function
        static B* gimmeABee();
    };
}

実装クラスは、それぞれの .cpp ファイルにあります。

(A.cpp)
namespace foo
{
    class AImpl : public A
    {
    public:
        A(std::string member_data) : m_member_data(member_data) {};
        ~A() {};
        void method3()
        {
            //something really important, can't think of it right now ;-)
        };
    private:
        std::string m_member_data;
    };
    A* A::gimmeAnAyy()
    {
        return new AImpl("this is an impl of A");
    }; 
}

(B.cpp)
namespace foo
{
    class BImpl : public B
    {
    public:
        B(std::string other_data) : m_other_data(other_data) {};
        ~B() {};
        void method4()
        {
            //something really important, can't think of it right now ;-)
        };
    private:
        std::string m_other_data;
    };
    B* B::gimmeABee()
    {
        return new BImpl("this is an imll of B");
    }; 
}

今、コンパイラは、私が AImpl と BImpl に実装していない仮想関数 method1() と method2() について不平を言っています。

私が欲しいのは、AImpl と BImpl の両方が継承できる TImpl クラスで、2 つの異なる .cpp ファイルに method1() と method2() を実装する必要はありません。

出来ますか?私は昼食に出かけますか?StackExchange の投稿に対して修辞的な質問をしすぎていませんか?

前もって感謝します、

マイク

4

5 に答える 5

0

method1 と method2 を純粋仮想関数にしないでください。彼らに実装を与えてください!

すなわち

宣言する

class T
    {
    public:
        virtual void method1(std::string a_parameter);
        virtual void method2();
    };

定義:

void T::method1(std::string a_parameter) { // Could use const/reference here perhaps

....

}

等...

于 2013-08-28T01:37:03.567 に答える
0

あなたの問題は、virtual基本クラスに純粋な関数のみを含める方が良いと信じているのは間違っているようです! それを乗り越えて、 でデフォルトの実装を提供してTください。宗教的には悪いと信じられていますが、それを持たない技術的な理由はありません。virtual基本クラスに純粋な関数のみを含めることを主張することは、すべての音楽を12 トーンの音楽にする必要があると主張するようなものです。

于 2013-08-28T01:39:04.100 に答える
0

両方の子クラス (A & B) には (method1, method2) がないため、仮想を使用する必要はありません。ここでの継承タイプはパブリックであるため、基本クラスでデフォルトの実装を簡単に提供し、継承チェーンを介してこれらのメソッドを呼び出して使用できます。

于 2013-08-28T01:58:41.783 に答える
0

A クラスと B クラスの宣言では、メソッド 3 と 4 は純粋仮想であるため、定義ファイルでそれらの実装を指定しないでください。私の理解では、A と B は、T メソッドと独自の仮想メソッドの実装を、それらから継承する他の具体的なクラスに導きます。A と B が具象クラスである場合は、次の行から「= 0」を削除します。

class A : public T
{
public:
    virtual ~A() {};
    virtual void method3() = 0; // <-- Here
    //and a factory function
    static A* gimmeAnAyy();
};

class B : public T
{
public:
    virtual ~B() {};
    virtual void method4() = 0; // <-- and Here
    //and a factory function
    static B* gimmeABee();
};

T クラスのメソッド 1 と 2 を実装したくない場合は、T クラスまたは A クラスと B クラスで、それらに空の実装またはデフォルトの実装を指定します。

ただし、インターフェイスから継承する場合は、そのインターフェイスを実装する必要があることを考慮してください。:)

于 2013-08-28T02:20:13.290 に答える