2

私はC++を学んでいますが、継承と演算子のオーバーロードがどのように機能するかについて少し不明確なので、ここで何かばかげたことをしている可能性があります。

測定単位を表すためのいくつかの非常に基本的な操作を定義する基本クラスがあります。

#pragma once
class UnitOfMeasure
{
public:
    UnitOfMeasure(void) : mAmount(0) {}
    UnitOfMeasure(double amount) : mAmount(amount) { }
    ~UnitOfMeasure() {}

    void SetAmount(double amount) { mAmount = amount; }

    UnitOfMeasure& operator+=(const UnitOfMeasure& rhs)
    {
        mAmount += rhs.mAmount;
        return *this;
    }

    friend bool operator==(const UnitOfMeasure&, const UnitOfMeasure&);

protected:
    double mAmount;
};

bool operator==(const UnitOfMeasure& lhs, const UnitOfMeasure &rhs)
{
    return rhs.mAmount == lhs.mAmount;
}

次に、サブクラスは次のような特定の変換を実装します。

#pragma once
#include "UnitOfMeasure.h"

class Temperature : public UnitOfMeasure
{
public:
    enum TemperatureUnit { CELSIUS, FAHRENHEIT };
    Temperature(void) { }
    Temperature(double amount, TemperatureUnit units=CELSIUS) { SetAmount(amount, units); }
    ~Temperature(void) {};
    void SetAmount(double amount, TemperatureUnit units=CELSIUS)
    {
        switch(units)
        {
            case CELSIUS: { mAmount = amount; break; }
            case FAHRENHEIT: { mAmount = (amount - 32) / 1.8; break; }
        }
    }
    double Fahrenheit() { return 32 + (mAmount * 1.8); }
    double Celsius() { return mAmount; };
};

私のサンプルプログラムでは、Temperatureのインスタンスをリストに保存していますが、ここから状況がおかしくなり始めます。すべてのコードが.hファイルに含まれている場合、すべてが正常です。コンパイルして正常に実行できます。ただし、Temperatureのコードを別の.cppファイルに分割すると、コンパイラが文句を言います。私はこれらのメッセージを受け取ります:

1>  Temperature.cpp
1>Temperature.obj : error LNK2005: "bool __cdecl operator==(class UnitOfMeasure const &,class UnitOfMeasure const &)" (??8@YA_NABVUnitOfMeasure@@0@Z) already defined in BadComparison.obj
1> BadComparison.exe : fatal error LNK1169: one or more multiply defined symbols found

(私はVisual Studio 2012を使用しています)

コンパイラは、Temperatureクラス用に別の==演算子を作成していますか?

ありがとう!

4

1 に答える 1

6

演算子の定義が、対応するヘッダー ファイルinlineの複数の翻訳単位の一部になることを避けるために、演算子を宣言する必要があります。#include

    inline bool operator==(const UnitOfMeasure& lhs, const UnitOfMeasure &rhs)
//  ^^^^^^
    {
        return rhs.mAmount == lhs.mAmount;
    }

その場合、リンカは最終的に、プログラム内で同じ関数が複数回定義されていることを訴えます。これはOne Definition Ruleの違反です。

于 2013-03-19T23:43:30.823 に答える