【发布时间】:2013-10-04 20:42:32
【问题描述】:
给定 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;
}
输出:
命名一些字符串
【问题讨论】:
-
什么意思你一切正常?上面的代码完全被破坏了。
A::print的实现在哪里?B和C中的print函数不会覆盖A中的函数。此外,A没有实现operator[]。最后,您希望在这里发生什么...*this = dynamic_cast<void*>(obj);?我也很想知道您选择避开标准库的哪一部分,以及出于什么原因。 -
我认为 main 中的代码是他想要做的一个例子。因为他说除了存储类对象 b 和 c 的引用之外,一切都在工作。 @Praetorian 是对的,但对 *this 的分配非常可疑。
-
@Praetorian 你能解释一下如果 A DID 实现 operator[] 我可以用 A 做什么吗?
-
如果你实现了
A::operator[],那么a[0]->print();这个语句就有意义了。您似乎对继承也有一些误解。如果您想要A充当B实例的容器,则不必让B派生自A。
标签: c++ arrays class c++11 polymorphism