访问实例化类的变量/函数

时间:2017-11-13 16:35:29

标签: c++ c++11

我正在尝试编写与物理上发生的事情相匹配的代码。我编写访问物理机箱的代码,其中有两个硬件设备。现在我有一个底盘类,我想要底盘级变量和功能(Hostname,port,readVariable,...)。我还有设备级别的类,它们具有特定于设备的功能,但需要访问机箱级别的信息。

现在看起来像这个伪代码:

class Chassis {
  public:
    Chassis():

    String hostname;
    int port;
    Dev1 device1;
    Dev2 device2;

    int readVar(String varName, String *result);
    int writeVar(String varName, String varVal);
}

class Dev1 {
  public:
    Dev1();
    int updateStatusVars();
}

Dev1::Dev1() {
}

int Dev1::updateStatusVars() {
  int status = Chassis::readVar("Var1",var1Val);
  return status;
}

有没有更好的方法来解决这个问题?我希望主类只有一个机箱实例,而后者则保存对设备的引用。继承并没有真正解决这个问题,因为我必须有两个设备,每个设备都从机箱继承。这些设备中的每一个都可以具有不同的主机名和端口。我不希望这样。这是我特别想避免的情况。我希望对每个设备可访问的主机名和端口以及设备也可以访问的某些功能进行单一引用。

这样做的最佳方式是什么?

1 个答案:

答案 0 :(得分:0)

机箱不了解其中安装的特定硬件,而是定义了I / O接口。这些设备也作为单独的实体存在,可以插入或不插入机箱。我会这样建模(伪代码)......

class PCIInterface
{
public:
    PCIInterface(){}
    virtual ~PCIInterface(){}
    virtual void Update()=0;
    virtual int ReadVar ( String varName, String *result )=0;
    virtual int WriteVar( String varName, String value )=0;
};

class Device : public PCIInterface
{
public:
    Device(){}
    virtual ~Device(){}

    void Powerup( PCIInterface *chassis );

    /* PCIInterface */
    virtual void Update();
    virtual int ReadVar( String varName, String *result );
    virtual int WriteVar( String varName, String value );

protected:
    PCIInterface *m_chassis;
}

void Device::Powerup( PCIInterface *chassis )
{
m_chassis = chassis;
}

class Chassis : public PCIInterface
{
public:
    Chassis(){ m_slots.resize( MAX_SLOTS ); }
    virtual ~Chassis(){}

    void PlugIn( const int slot_id, Device *device );

    /* PCIInterface */
    virtual void Update();
    virtual int ReadVar( String varName, String *result );
    virtual int WriteVar( String varName, String value );

protected:
    std::vector<PCIInterface*> m_slots;
}

void Chassis::PlugIn( const int slot_id, Device *device )
{
assert( slot_id < m_slots.size() );
m_slots[ slot_id ] = device;
device->PowerUp( this );
}

void Chassis::Update()
{
for( auto device : m_slots )
    {
    if( *device ) device->Update();
    }
}

class DeviceFlower : public Device
{
...
}

void DeviceFlower::Update()
{
String str;
m_chassis->ReadVar( "ChassisName", &str );
cout << str;
}

class DeviceRock : public Device
{
...
}

void main()
{
auto the_chassis = Chassis();
auto first_device = DeviceFlower();
auto second_device = DeviceRock();

the_chassis.PlugIn( 0, &first_device );
the_chassis.PlugIn( 1, &second_device );

while( true )
    {
    the_chassis.Update();
    }

}