【问题标题】:exporting class from dll error从 dll 错误导出类
【发布时间】:2011-09-08 15:44:21
【问题描述】:

我只想为客户端公开 CreateSort()。它是为排序类的实现创建一个对象,即 imSort 然后将其返回给客户端。但是编译器说它无法创建抽象类的对象,即使所有函数都已在派生类中定义。

/////sort.h

class __declspec(dllexport) Sort {
public:
virtual int* BSort() const=0;
virtual void getdata() const=0;
};

extern "C" Sort *CreateSort();

/////imSort.h
#include "Sort.h"
class imSort : public Sort{
private:
int i,j,num;
int temp;
int *a;
public:
imSort();
int* BSort();
void getdata();
}

/////imSort.cpp

#include <iostream>
#include "imSort.h"
Sort *CreateSort()
{
return new imSort(); /* object of abstract class type "imSort" is not allowed: */
}
imSort::imSort()
{
i=j=num=0;
*a=0;
}

void imSort::getdata()
{
std::cout<<"\nEnter the number of elements..";
std::cin>>num;
for(i=0;i<num;i++)
{
    std::cin>>*a;
    *(a++);
}
}
int* imSort::BSort()
{
for(i=0;i<num;i++)
    for(j=i+1;j<num;j++)
    {
        if(*(a+i)<*(a+j))
        {
            temp=*(a+i);
            *(a+i)=*(a+j);
            *(a+j)=temp;
        }
    }
    return a;
}

【问题讨论】:

  • 这是一个精心设计的笑话,是吗?
  • 搞笑,我们必须找到问题和答案
  • 欢迎来到 Stack Overflow!你在向a good introductory book学习C++吗?

标签: c++ dll


【解决方案1】:

你的基类有:

virtual int* BSort() const=0;
virtual void getdata() const=0;

但是你的派生类有:

int* BSort();
void getdata();

重复virtual 关键字是可选的,但没有const 这些是单独的 函数,与虚拟基函数无关

因此,这些纯虚函数在派生类中仍未被覆盖,因此imSort(如果你问我,这是一个愚蠢的类型名称)仍然是抽象的。

因此,您的固定派生类定义是:

class imSort : public Sort {
   private:
      int  i, j, num;
      int  temp;
      int* a;

   public:
      imSort();
      int* BSort() const;     // <--- const
      void getdata() const;   // <--- const
};                            // <--- ;

(注意缩进如何提高代码的易读性?而您忘记了类定义末尾的;。)


下次请写一个完整的问题,并将您的问题减少到最小的测试用例。

【讨论】:

  • 添加了 const 的......但现在我得到一个编译器错误,因为 imSort.h 中的 int* imSort::BSort() 声明不兼容......
  • 你的函数定义也需要匹配,所以:int* imSort::BSort() const { ... }。你在用哪本 C++ 书?
  • @Janak:我不熟悉一本名为“essential com”的 C++ 书籍。从this list of recommended resources获取一份,这样你就可以正确学习C++了!
  • @Janak - 如果您的意思是 Don Box 的“Essential COM”,那么它是一本不错的 COM 编程书籍,如果是旧书的话。您还应该从 Tomalak 发布的列表中获得一本不错的通用 C++ 书籍。
【解决方案2】:

如果抽象Sort 类中的虚函数声明为const,则imSort 类中的实现也应声明为imSort,但它们不是。

所以只需在这里和那里添加 const...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多