0

ライブラリ機能を複数のクラスに分割するのはこれが初めてです。クラスごとにオブジェクトをインスタンス化する方法が正確にはわかりません。クラスが同じ.hファイルにある場合でも、それらのクラスメソッドと変数にアクセスするために、クラスオブジェクトをインスタンス化する必要がありますか?30行目で「不完全なタイプは許可されていません」というエラーが表示されます。

私のコード:

/*
File: sensor.h

Header file for phSensor Library.
*/

#ifndef SENSOR_H
#define SENSOR_H

#include "mbed.h"
#include "cfExtensions.h"
#include "msExtensions.h"

#include <string>

class phSensor;
class ecSensor;
class tempSensor;

class sensor
{
public:
    sensor(); //Default sensor constructor
    sensor(cfExtensions &cfExt, msExtensions &msExt);

private:
    cfExtensions &_cfExt;
    msExtensions &_msExt;

    phSensor     ph;  // Line 30, gets error "incomplete type is not allowed"
    ecSensor     ec;
    tempSensor   temp;

    string _phCurrentPhValue;
    string _phMaxValue;
    string _phMinValue;

};

class phSensor
    : public sensor
{
public:
    phSensor();

    void outputPhMaxValue();

private:
    float _getCurrentPhValue();
    float _getPhMaxValue();
    float _getPhMinValue();

    void _setPhMaxValue();
    void _setPhMinValue();

    void _calibratePhSensor();

    Ticker getPhMax;
    Ticker getPhMin;
};

class ecSensor
    : public sensor
{
public:
    ecSensor();
};

class tempSensor
    : public sensor
{
public:
    tempSensor();

};

#endif
4

4 に答える 4

2

あなたの場合、不完全な型へのポインタまたは参照のみを宣言できます

phSensor     ph;
ecSensor     ec;
tempSensor   temp;

これらすべてでエラーが発生し、sensorすべてのメンバーのレイアウトを知らずに のレイアウトを定義することはできません。

また、オブジェクトに独自のクラスのサブオブジェクトを含めることはできませんが、それはあなたがやろうとしていることphSensorでありecSensor、継承sensorとメンバーの両方ですsensor。ほとんどの場合、これらをポインターにする必要があります。

phSensor     *ph;
ecSensor     *ec;
tempSensor   *temp;
于 2012-12-05T13:39:26.633 に答える
2

他の人は、宣言の問題についてすでにコメントしていphSensor ph;ます。

あなたのデザインについてコメントします。

最初のオフについてclass sensor
、なぜこれを行うのですか?

オブジェクト指向で最初に学ぶことの 1 つは、クラスなどの継承Vehicleについてです。とても素晴らしく、とてもシンプルですが、しばしば間違っています。最終的には、オブジェクト指向プログラミングの素朴な見方を忘れる必要があります。CarTruckBicycle

Sensor適切な例: pH センサー、導電率センサー、および温度センサーがすべて何らかのタイプのセンサーであるからといって、基本クラスを作成することが必ずしも良い考えであるとは限りません。すべてのセンサーに共通する要素は何ですか? sensor何もない場合、その基本クラスを持つことはおそらくあまり良い考えではありません。


あなたのsensorクラスは 2 つのことを行っていますこれは、他のセンサー クラスの基本クラスとして機能し、3 種類のセンサーのコレクションとして機能します。これらは 2 つの非常に異なるものであるため、これらの異なる動作は 2 つの非常に異なるクラスに属する必要があります。sensorそのクラスを 2 つのクラスに分割し、基本クラス (必要な場合。上記を参照) と、multisensorpH センサー、導電率センサー、および温度センサーを含むクラスとして機能させると、差し迫った問題は解消されます。このクラスを から、またはなどmultisensorから継承する必要はありません。代わりに、この新しいクラスには複数のセンサーが含まれます。多くの場合、構成は継承よりもはるかに優れた方法です。sensorphsensor

クラスsensorコンストラクター
について 参照である 2 つのデータ メンバーがあります。参照は、コンストラクターによってのみ設定でき、初期化リストでのみ設定できます。デフォルト以外のコンストラクターが何をするかを見ることができます。デフォルトのコンストラクターは何をしますか? sensor派生クラスにはデフォルトのコンストラクターしかありません。これは、クラスのデフォルトのコンストラクターを呼び出していることを示唆しています。これは理にかなっていますか?これらのデフォルト コンストラクターを削除した方がよい場合があります。C++03 でこれを行う標準的な方法は、既定のコンストラクターをプライベートに宣言し、実装を提供しないことです。C++11 には、コンストラクターを削除済みとして宣言するというより良いオプションがあります。

于 2012-12-05T14:35:06.887 に答える
1

phSensor-class を宣言するので、型名は既知です。それでも、この時点では、コンパイラはそのクラスのメンバーまたはメソッドについて何も知らないため、型のサイズを知ることができません。クラスが宣言されているだけで定義されていない限り、ポインターまたは参照のみを使用できます。

また、クラスのレイアウトをよく見ると、これは機能しません。phSensor をインスタンス化するとしましょう。phSensor はセンサーを拡張するため、センサーのすべてのメンバーも初期化されます。これらのメンバーの 1 つは、センサーから派生した phSensor であり、センサーを継承する別の phSensor を保持します。ご覧のとおり、このインスタンス化は決して終了せず、すべてのメモリを使い果たします。

于 2012-12-05T13:39:41.847 に答える
1

同じファイルでクラスを宣言しないでください。コードをモジュール化するという考えは、それを行うと意味がありません。

于 2012-12-05T13:40:26.047 に答える