要只能通过自定的导出函数来new 一个类实例,而且为了防止类被只接创建,把类构造函数设为protect,
所以开放给外部用的导出函数想要new 这个类的实例,就得设为这个类的friend.
但是不知道这个Create应该用什么格式书写,编译不通过,郁闷,希望大家能帮帮忙!
--------------------------Base.h
class CBase  
{
protected:
//这friend应该怎么写?
friend CBase* Create();
//friend __declspec(dllexport) CBase* Create();
CBase();
public:
virtual void DeleteThis();
virtual ~CBase();
private:
};-------------------------Base.cpp
#include "stdafx.h"
#include "Base.h"CBase::CBase()
{
}
CBase::~CBase()
{
}
void CBase::DeleteThis()
{
delete this;
}extern "C" __declspec(dllexport) CBase* Create()//
{
return new CBase();
}

解决方案 »

  1.   

    如果不用extern "C"
    --------------------------Base.h
    class CBase  
    {
    friend __declspec(dllexport) CBase* Create();
    protected:
    CBase();
    public:
    virtual void DeleteThis();
    virtual ~CBase();
    private:
    };
    __declspec(dllexport) CBase* Create();-------------------------Base.cpp
    #include "stdafx.h"
    #include "Base.h"CBase::CBase()
    {
    }
    CBase::~CBase()
    {
    }
    void CBase::DeleteThis()
    {
    delete this;
    }__declspec(dllexport) CBase* Create()//
    {
    return new CBase();
    }
      

  2.   

    还是编译错误,protected的构造函数不能被外部函数访问.
    只能用别的办法了?
      

  3.   

    void create(int elems)//elems 是要的对象数
    {
    char *p = new char[sizeof(CBase)*elems]; // 每个元素的独立初始化
    int offset = sizeof( CBase );
    for ( int ix = 0; ix < elems; ++ix )
    {
    new( p+offset*ix ) CBase();//实现一个公有的带缺省参的构照函数
    }
    }