Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 存取器';设计_C++_Oop_Design Patterns - Fatal编程技术网

C++ 存取器';设计

C++ 存取器';设计,c++,oop,design-patterns,C++,Oop,Design Patterns,考虑到我有 class IChunk { public: const char* getRawData() = 0; ... }; class Chunk { public: const char* getRawData(); ... private: char* data; }; class IDatabase { public: IChunk* getChunk( int index ) = 0; ... };

考虑到我有

class IChunk
{
  public:
    const char* getRawData() = 0;
    ...
};

class Chunk
{
  public:
    const char* getRawData();
    ...

  private:
    char* data;
};

class IDatabase
{
  public:
    IChunk* getChunk( int index ) = 0;
    ...
};

class Database : public IDatabase
{
  public:
    IChunk* getChunk( int index );
    ...

  private:
    std::vector< Chunk > m_chunks;
};
其中,
index
是块的索引,
ACC\u ID\u x
是访问器接口ID

  • 在这种情况下,需要动态浇铸,这可能不安全,设计也不是很好。我能改进一下吗

  • 我应该看哪种设计模式来实现访问者工厂?我的目的是允许动态添加访问者(以及相应的访问者ID)

  • 是否可以通过以下方式实现访问器创建:

    IAccessor*  a  = database->createAccessor( ACC_ID_1, index );
    IAccessor1* a1 = dynamic_cast< IAccessor1* >a;
    IAccessor*  a  = database->createAccessor( ACC_ID_2, index );
    IAccessor1* a2 = dynamic_cast< IAccessor2* >a;
    
    IAccessor3* a3;
    database->createAccessor( ACC_ID_3, index, (void**)&a3 );
    

  • 为什么不将数据库对象和块索引作为构造函数参数传递给访问器呢

    class IAccessor
    {
    protected:
      IAccessor (IDatabase *database, int index) : m_database (database), m_index (index) {}
      IDatabase *m_database;
      int m_index;
    };
    
    class Accessor1 : public IAccessor
    {
    public:
      Accessor1 (IDatabase *database, int index) : IAccessor (database, index) {}
    };
    
    然后:

    Accessor1 a1 (database, index);
    some_value = a1.SomeFunction ();
    

    解决方案应该是一个库实现。一些访问器将在此库中实现。我希望库用户可以扩展功能,并遵循库本身使用的相同机制。该库能够返回指向接口的指针,而不是类实例的指针。@Serge:这并不妨碍库的实现。该库可以提供多个从IAccessor派生的类供一般使用,用户可以从IAccessor派生自己的类供特定需要。如果不希望自定义IAccessor必须处理IDatabase和IChunk对象,可以将实际数据的访问器添加到IAccessor基类中。