簡體   English   中英

C ++中的類的前向聲明

[英]Forward Declaration of Classes in C++

我編寫了以下代碼,以幫助我檢查繼承以及C ++中的分派/雙重分派如何工作,但無法編譯。 我已經查看了類原型/轉發聲明,並且這樣做了,但是仍然出現錯誤“ B是不完整的類型”,“ SubB是不完整的類型”等。這是什么問題?

#include <iostream>

class B;
class SubB;

class A { 
    public:
        void talkTo(B b){
            std::cout << "A talking to instance of B" << std::endl;
        }
        void talkTo(SubB sb){
            std::cout << "A talking to instance of SubB" << std::endl;
        }
};
class SubA : A {
    public:
        void talkTo(B b){
            std::cout << "SubA talking to instance of B" << std::endl;
        }
        void talkTo(SubB sb){
            std::cout << "SubA talking to instance of SubB" << std::endl;
        }
};
class B { 
    public:
        void talkTo(A a){
            std::cout << "B talking to instance of A" << std::endl;
        }
        void talkTo(SubA sa){
            std::cout << "B talking to instance of SubA" << std::endl;
        }
};
class SubB : B {
    public:
        void talkTo(A a){
            std::cout << "SubB talking to instance of A" << std::endl;
        }
        void talkTo(SubA sa){
            std::cout << "SubB talking to instance of SubA" << std::endl;
        }
};

編輯

將參數更改為引用即可完成這項工作(R Sahu的幫助),但是為什么現在不起作用?

class A { 
    public:
        void talkTo(B &b){
            //std::cout << "A talking to instance of B" << std::endl;
            b.talkTo(this);
        }
        void talkTo(SubB &sb){
            //std::cout << "A talking to instance of SubB" << std::endl;
            sb.talkTo(this);
        }
};
class B { 
    public:
        void talkTo(A &a){
            std::cout << "B talking to instance of A" << std::endl;
        }
        void talkTo(SubA &sa){
            std::cout << "B talking to instance of SubA" << std::endl;
        }
};
class SubB : B {
    public:
        void talkTo(A &a){
            std::cout << "SubB talking to instance of A" << std::endl;
        }
        void talkTo(SubA &sa){
            std::cout << "SubB talking to instance of SubA" << std::endl;
        }
};

A a;
SubA subA;
B b;
SubB subB;

a.talkTo(b);
a.talkTo(subB);

當具有前向聲明時,只能將類型用作引用:指針和引用是最明顯的引用。

代替

    void talkTo(B b){
        std::cout << "A talking to instance of B" << std::endl;
    }
    void talkTo(SubB sb){
        std::cout << "A talking to instance of SubB" << std::endl;
    }

采用

    void talkTo(B const& b){
        std::cout << "A talking to instance of B" << std::endl;
    }
    void talkTo(SubB const& sb){
        std::cout << "A talking to instance of SubB" << std::endl;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM