我不熟悉 C++ 和一般的面向对象编程。我的问题是如何将多个对象与多个子类对象链接起来,每个子类对象都有多个要跟踪的数据变量?
基本上我有对象类型“reciever”。每个“接收者”都有特定的变量来存储数据流中的信息。但是,每个“接收者”都有 32 个可能的“ channel ”。每个 channel 都有更多的数据变量要存储。
假设我希望程序最多有 100 个接收者。构建这个的最佳方法是什么?我一直这样想:
class BaseStation{
public:
string baseID;
int numberSat;
FP64 timeUTC;
INT16U week;
FP64 GPStoUTCoffset;
FP64 GLOtoUTCoffset;
INT8S recieverTimeOffset;
FP64 posX; //geocentric coordinates in meters
FP64 posY;
FP64 posZ;
FP64 rmsX; //expected root mean square error of coordinates
FP64 rmsY;
FP64 rmsZ;
};
class Channels : public BaseStation
{
public:
INT8U systemID;
INT8U satID;
INT8U GlonassNumber;
INT8U SNR; //signal to noise ratio
FP64 carrierPhase; //cylces
FP64 psuedoRange; //milliseconds
FP64 doppler; //HZ cycles
FP64 tropDelay; //meters
FP64 ionoDelay; //meters
};
然后创建如下对象:
Channels base[100];
Channels channel[100][32];
除了确保 base 和 channel 的数组指针相同之外,还有其他方法可以将 32 个 channel 绑定(bind)到单个 base 对象吗?
接收者与 channel 是一对多的关系。如果你知道你总是有 32,你可以这样做:
class Receiver {
Channel channels[32];
/* variables specific to a receiver */
string baseID;
int numberSat;
FP64 timeUTC;
INT16U week;
FP64 GPStoUTCoffset;
FP64 GLOtoUTCoffset;
INT8S recieverTimeOffset;
FP64 posX; //geocentric coordinates in meters
FP64 posY;
FP64 posZ;
FP64 rmsX; //expected root mean square error of coordinates
FP64 rmsY;
FP64 rmsZ;
};
这是最简单的变体。使用指针数组可能更好(如果 channel 不存在/未使用,则将 channel 设置为 NULL)。或者,您可以考虑使用 STL::vector
。
class Channel {
/* variables specific a single channel */
INT8U systemID;
INT8U satID;
INT8U GlonassNumber;
INT8U SNR; //signal to noise ratio
FP64 carrierPhase; //cylces
FP64 psuedoRange; //milliseconds
FP64 doppler; //HZ cycles
FP64 tropDelay; //meters
FP64 ionoDelay; //meters
};
然后在您的顶层模块中,创建一个包含 100 个接收器的数组:
Receiver allReceivers[100];
同样,如果您不总是恰好有 100 个,那么有更好的方法来存储它,就像您在上面的接收器中使用 channel 一样。您还可以将接收器封装到顶级类中,并在其中管理接收器数组。
还要注意:
Channels channel[100][32];
在这里,您要声明一个二维 channel 数组。这可能行得通,但使用封装接收器中的 channel 集(对关系建模)是更好的 OOP。
祝你好运!
我是一名优秀的程序员,十分优秀!