0

给定 A 类和 B 类。我需要使用 cpp 文件中所示的“add”函数将 B 类的对象引用存储在 A 类的对象数组中。

我应该能够使用 cpp 文件中所示的“->”来调用 B 类的“打印”函数。

编译时错误: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

解决方案涉及上述所有评论的建议

比较问题和答案之间的差异以充分了解解决方案。

我需要做的是将 A 类的私有 a_ 成员更改为 A 类型:A * _a[256]
NEXT:我需要将 operator[] 和 add 方法的参数也更改为 A 类型:A * operator[]( A * obj)
NEXT:我需要添加一个 virtual void print() 用于类 A 的继承。
最后:类 B 需要继承类 A

下面是工作代码

注意:我不确定这段代码是否完全安全或正确处理内存问题,但我知道它会打印以输出它打算打印的内容。

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

// 头文件

// 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 回答
0

以下方法没有意义:

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

如果您想存储指向 inside 的其他实例的A指针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. 然后您可以将B's更改print()const并意识到const方法的重要性实际上很重要。

于 2013-10-04T21:02:37.083 回答