0

クラス A とクラス B を指定します。cpp ファイルに示されているように、「add」関数を使用して、クラス B のオブジェクト参照をクラス A のオブジェクト配列に格納する必要があります。

クラス B の「print」関数を呼び出すには、cpp ファイルに示されているように「->」を使用できるはずです。

コンパイル時エラー: void* はオブジェクトへのポインター型ではありません

では、どうすればこのエラーを解決できますか?

================================================== ================================

// ヘッダファイル

// ABC.h

class A{
     private:
        size_t size_;
        void * a_[256];
        static int index_;
    public:
        void add(void * obj);
        void * operator[](int x){
            return a_[x];
        }


};

class B {
    private:
        const char * f_;
        const char * l_;

    public:
        B(const char * fn, const char * loc ):f_(fn), l_(loc){ A(); };
        void print();
};

// cpp ファイル

#include "ABC.h"

int A::index_ = 0;

inline void A::add(void* obj){

    void * insertionPoint = static_cast<char *>(a_[index_]) + ( size_ * index_ );

    memcpy( insertionPoint, obj,  size_);

    ++index_;

}

inline void B::print(){
    ...
}

int main()
{
    A a;

    B b( "Name", "Some string");

    a.add( &b );

    a[0]->print(); // <-- This should be an object reference to B, but it is producing the error.

    return 0;
}

出力:

名前 何らかの文字列

4

2 に答える 2

0

次の方法は意味がありません。

virtual void add(A * obj){
    *this = dynamic_cast<void*>(obj);
}

Awithinの他のインスタンスへのポインターを格納する場合はA、それらを保持するポインターの配列を作成し、現在のインスタンスを「置換」しようとしても (つまり*this =...) 意味がありません。

のインスタンスを指してdynamic_castいるかどうかを調べたい場合にも、意味があることに注意してください。A*B

A* a = new B();
// in compile time it's A*, but does it really point to instance of B? :
B* b = dynamic_cast<B*>(a);

もっと簡単なことから始めてみませんか?まあ言ってみれば:

class A {
public:
    virtual void print() { std::cout << "a"; }
};

class B : public A {
public:
    void print() /* const */ { std::cout << "b"; }
};

使用されます:

A* a = new A();
A* b = new B();
a->print();
b->print();

これは(現状では)出力しますab。次に、 を to に変更すると、メソッドの性質が実際に重要であることがわかりBます。print()constconst

于 2013-10-04T21:02:37.083 に答える
0

解決策には、上記のすべてのコメントからのアドバイスが含まれていました

質問と回答の違いを比較して、解決策を完全に確認してください。

私がする必要があったのは、クラス A のプライベート a_ メンバーをタイプ A に変更することでした: A * _a[256]
次: operator[] と add メソッドのパラメーターもタイプ A に変更する必要がありました: A * operator[]( A * obj)
次へ: クラス A への継承のために、仮想 void print() を追加する必要がありました。最後に
: クラス A を継承するためにクラス B が必要でした

以下は作業コードです

注: このコードが完全に安全であるか、メモリの問題を適切に処理しているかどうかはわかりませんが、意図したとおりに出力されることはわかっています。

================================================== ================================

// ヘッダファイル

// ABC.h

class A{
     private:
        size_t size_;
        A * a_[256];
        static int index_;
    public:
        void add(A * obj);
        A * operator[](int x); // Any subclass object reference of A can be assigned now. 
        virtual void print()const; // Virtual tells the compiler to look for other void print methods first.


};

class B : public A{
    private:
        const char * f_;
        const char * l_;

    public:
        B(const char * fn, const char * loc ):f_(fn), l_(loc){ A(); };
        void print()const;
};

// cpp ファイル

#include "ABC.h"

int A::index_ = 0; // Need to call this here because it is declared static in Class A and can be used dynamically. 

inline A * A::operator[](int x){
    return a_[x]; // Implements operator[], so class A can act like a container.
}

inline void A::add(A* obj){

    a_[index_] = obj; // Adds a base or subclass object reference to class A object array.

    ++index_; // Need this to remember current index of object reference A's array.

}

inline void A::print()const{}

inline void B::print()const{

    std::cout <<  "B " << firstname_ << " works in " << location_ << std::endl;

}

int main()
{
    A a;

    B b( "Name", "Some string");

    a.add( &b );

    a[0]->print();

    return 0;
}

出力:

名前 何らかの文字列

于 2013-10-08T21:02:10.270 に答える