概要

  • const なメソッドからメンバ変数を更新したい場合は mutable 修飾子を付ける。
  • setMessage, clearMessage メソッド追加。(2014-05-21)
  • Class1 を継承した Class2 を追加。継承元の等価比較メソッドを呼び出すには、自分を継承元の型にキャストする。(2014-05-22)

ソース

Class1.h

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 
 
 
 
 
 
 
 
 
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
!
 
 
/**
	@file Class1.h
*/
 
#pragma once
 
#include <tchar.h>
 
class Class1
{
public:
    static const size_t MatrixColumn = 3;
    static const size_t MatrixRow = 3;
    static const size_t MessageBufferSize = 256;
 
    virtual ~Class1(void);    ///< デストラクタ
 
    Class1(void);            ///< デフォルトコンストラクタ
 
    /**
		初期化子付きコンストラクタ
	*/
    Class1(
        double x,
        double y,
        double matrix[MatrixRow][MatrixColumn],
        double error = 0    ///< [in] 許容誤差
    );
 
    /**
		等価比較演算子オーバーロード
		@retval	true	一致
		@retval	false	不一致
		@attention	getMessage() で比較結果が文字列として得られる。
	*/
    bool operator ==(
        const Class1& other
    ) const;
 
    /**
		非等値演算子オーバーロード
		@retval	true	不一致
		@retval	false	一致
		@attention	getMessage() で比較結果が文字列として得られる。
	*/
    bool operator !=(
        const Class1& other
    ) const;
 
    /**
		付帯情報を返す
	*/
    const _TCHAR* getMessage(void) const;
 
    /**
		付帯情報をセットする<br>
		引数は _stprintf_s に準じる。
		@retval	!-1	書き込まれた文字数
		@retval	-1	エラー
	*/
    int setMessage(const _TCHAR* format, ...) const;
 
    /**
		付帯情報をクリアする
	*/
    void clearMessage(void) const;
 
private:
    double            _x;
    double            _y;
    double            _matrix[MatrixRow][MatrixColumn];
    double            _error;                                ///< 許容誤差
    mutable _TCHAR    _message[MessageBufferSize];        ///< 付帯情報
};
 
// EOF

Class1.cpp

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
 
 
 
 
 
 
 
 
 
-
!
 
 
 
 
 
 
 
-
!
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
!
 
 
 
-
-
|
|
!
-
|
|
!
-
-
-
-
|
|
!
!
!
-
-
-
-
|
|
!
!
!
!
|
|
!
 
 
 
-
|
!
 
-
|
!
 
-
|
|
|
|
|
-
|
-
|
!
|
|
!
 
-
|
!
 
 
#include "StdAfx.h"
#include <Windows.h>
#include <math.h>
#include "Class1.h"
 
// 「新しい動作: 配列 'xxx' の要素は既定で初期化されます」を抑制
#pragma warning(disable: 4351)
 
Class1::~Class1(void)
{
}
 
Class1::Class1(void):
    _x(),
    _y(),
    _matrix(),
    _error(),
    _message()
{
}
 
Class1::Class1(
    double x,
    double y,
    double matrix[MatrixRow][MatrixColumn],
    double error
):
    _x(x),
    _y(y),
    _matrix(),
    _error(error > 0 ? error : 0),
    _message()
{
    size_t matrixSize = sizeof(_matrix);
    memcpy_s(_matrix, matrixSize, matrix, matrixSize);
}
 
bool Class1::operator ==(
    const Class1& other
) const {
    if ( _error > 0 ? fabs(_x - other._x) > _error : _x != other._x ){
        setMessage(_T("Not Equal(x)"));
        return false;
    }
    if ( _error > 0 ? fabs(_y - other._y) > _error : _y != other._y ){
        setMessage(_T("Not Equal(y)"));
        return false;
    }
    if ( _error > 0 ){
        for(size_t v=0; v < MatrixRow; ++v){
            for(size_t u=0; u < MatrixColumn; ++u){
                if ( fabs( _matrix[v][u] - other._matrix[v][u] ) > _error ){
                    setMessage(_T("Not Equal(matrix[%d][%d])"), v, u);
                    return false;
                }
            }
        }
    } else {
        for(size_t v=0; v < MatrixRow; ++v){
            for(size_t u=0; u < MatrixColumn; ++u){
                if ( _matrix[v][u] != other._matrix[v][u] ){
                    setMessage(_T("Not Equal(matrix[%d][%d])"), v, u);
                    return false;
                }
            }
        }
    }
    setMessage(_T("Equal"));
    return true;
}
 
bool Class1::operator !=(
    const Class1& other
) const {
    return !(*this == other);
}
 
const _TCHAR* Class1::getMessage(void) const {
    return _message;
}
 
int Class1::setMessage(const _TCHAR* format, ...) const {
    clearMessage();
    int total = 0;
    va_list    argp;
    va_start(argp, format);
    int ret = _vstprintf_s(_message, format, argp);
    if ( total >= 0 && ret >= 0 ){
        total += ret;
    } else {
        total = -1;
    }
    va_end(argp);
    return total;
}
 
void Class1::clearMessage(void) const {
    SecureZeroMemory(_message, sizeof(_message));
}
 
// EOF

Class2.h

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 
 
 
 
 
 
 
 
 
 
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
!
 
 
/**
	@file Class2.h
*/
 
#pragma once
 
#include "Class1.h"
 
class Class2 :
    public Class1
{
public:
    virtual ~Class2(void);    ///< デストラクタ
 
    Class2(void);            ///< デフォルトコンストラクタ
 
    /**
		初期化子付きコンストラクタ
	*/
    Class2(
        double x,
        double y,
        int z,
        double matrix[MatrixRow][MatrixColumn],
        double error = 0    ///< [in] 許容誤差
    );
 
    /**
		等価比較演算子オーバーロード
		@retval	true	一致
		@retval	false	不一致
		@attention	getMessage() で比較結果が文字列として得られる。
	*/
    bool operator ==(
        const Class2& other
    ) const;
 
    /**
		非等値演算子オーバーロード
		@retval	true	不一致
		@retval	false	一致
		@attention	getMessage() で比較結果が文字列として得られる。
	*/
    bool operator !=(
        const Class2& other
    ) const;
 
private:
    int        _z;
};
 
// EOF

Class2.cpp

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 
 
 
 
-
!
 
 
 
 
-
!
 
 
 
 
 
 
 
 
 
 
-
!
 
 
 
-
-
|
!
-
|
|
!
|
|
!
 
 
 
-
|
!
 
 
#include "StdAfx.h"
#include "Class2.h"
 
Class2::~Class2(void)
{
}
 
Class2::Class2(void):
    Class1(),
    _z()
{
}
 
Class2::Class2(
    double x,
    double y,
    int z,
    double matrix[MatrixRow][MatrixColumn],
    double error
):
    Class1(x, y, matrix, error),
    _z(z)
{
}
 
bool Class2::operator ==(
    const Class2& other
) const {
    if ( *(Class1*)this != other ){
        return false;
    }
    if ( _z != other._z ){
        setMessage(_T("Not Equal(z)"));
        return false;
    }
    setMessage(_T("Equal"));
    return true;
}
 
bool Class2::operator !=(
    const Class2& other
) const {
    return !(*this == other);
}
 
// EOF

Main.cpp

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
 
 
 
 
 
 
 
 
 
-
|
|
|
|
|
!
 
-
-
|
-
|
|
|
!
|
!
-
|
-
|
|
|
!
|
!
-
|
-
|
|
|
!
|
!
-
|
-
|
|
|
!
|
!
!
 
 
-
|
|
|
|
|
-
|
|
|
-
|
|
|
|
|
|
|
|
|
|
|
|
|
!
!
|
|
-
|
|
|
-
|
|
|
|
|
|
|
|
|
|
|
|
|
!
!
|
|
!
 
 
// Main.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
 
#include "stdafx.h"
#include <Windows.h>
#include <locale.h>
#include "Class1.h"
#include "Class2.h"
 
struct TestCase {
    double    x;
    double    y;
    int        z;
    double    matrix[Class1::MatrixRow][Class1::MatrixColumn];
    double    error;        ///< 許容誤差
};
 
TestCase testCases[] = {
    {
        1.000, 2.000, 3,
        {
            { 1.000, 2.000, 3.000 },
            { 4.000, 5.000, 6.000 },
            { 7.000, 8.000, 9.000 },
        },
        0.000
    },
    {
        1.000, 2.002, 3,
        {
            { 1.000, 2.000, 3.000 },
            { 4.007, 5.000, 6.000 },
            { 7.000, 8.004, 9.000 },
        },
        0.000
    },
    {
        1.000, 2.000, 4,
        {
            { 1.000, 2.000, 3.000 },
            { 4.000, 5.000, 6.000 },
            { 7.000, 8.000, 9.000 },
        },
        0.005
    },
    {
        1.000, 2.002, 3,
        {
            { 1.000, 2.000, 3.000 },
            { 4.007, 5.000, 6.000 },
            { 7.000, 8.004, 9.000 },
        },
        0.010
    },
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    wchar_t wszLocale[MAX_PATH];
    GetLocaleInfoW(GetThreadLocale(), LOCALE_SABBREVLANGNAME, wszLocale, _countof(wszLocale));
    _wsetlocale(LC_ALL, wszLocale);
 
    _tprintf(_T("Class1:\n"));
    for(size_t v=0; v < _countof(testCases); ++v){
        TestCase testV = testCases[v];
        _tprintf(_T("----\n"));
        Class1 classV(testV.x, testV.y, testV.matrix, testV.error);
        for(size_t u=0; u < _countof(testCases); ++u){
            TestCase testU = testCases[u];
            Class1 classU(testU.x, testU.y, testU.matrix, testU.error);
            _tprintf(
                _T("[%d]==[%d] : %s : %s\n"),
                v, u,
                (classV == classU ? _T("true") : _T("false")),
                classV.getMessage());
            _tprintf(
                _T("[%d]!=[%d] : %s : %s\n"),
                v, u,
                (classV != classU ? _T("true") : _T("false")),
                classV.getMessage());
            _tprintf(_T("\n"));
        }
    }
 
    _tprintf(_T("Class2:\n"));
    for(size_t v=0; v < _countof(testCases); ++v){
        TestCase testV = testCases[v];
        _tprintf(_T("----\n"));
        Class2 classV(testV.x, testV.y, testV.z, testV.matrix, testV.error);
        for(size_t u=0; u < _countof(testCases); ++u){
            TestCase testU = testCases[u];
            Class2 classU(testU.x, testU.y, testU.z, testU.matrix, testU.error);
            _tprintf(
                _T("[%d]==[%d] : %s : %s\n"),
                v, u,
                (classV == classU ? _T("true") : _T("false")),
                classV.getMessage());
            _tprintf(
                _T("[%d]!=[%d] : %s : %s\n"),
                v, u,
                (classV != classU ? _T("true") : _T("false")),
                classV.getMessage());
            _tprintf(_T("\n"));
        }
    }
 
    return 0;
}
 
// EOF

出力

Class1:
----
[0]==[0] : true : Equal
[0]!=[0] : false : Equal

[0]==[1] : false : Not Equal(y)
[0]!=[1] : true : Not Equal(y)

[0]==[2] : true : Equal
[0]!=[2] : false : Equal

[0]==[3] : false : Not Equal(y)
[0]!=[3] : true : Not Equal(y)

----
[1]==[0] : false : Not Equal(y)
[1]!=[0] : true : Not Equal(y)

[1]==[1] : true : Equal
[1]!=[1] : false : Equal

[1]==[2] : false : Not Equal(y)
[1]!=[2] : true : Not Equal(y)

[1]==[3] : true : Equal
[1]!=[3] : false : Equal

----
[2]==[0] : true : Equal
[2]!=[0] : false : Equal

[2]==[1] : false : Not Equal(matrix[1][0])
[2]!=[1] : true : Not Equal(matrix[1][0])

[2]==[2] : true : Equal
[2]!=[2] : false : Equal

[2]==[3] : false : Not Equal(matrix[1][0])
[2]!=[3] : true : Not Equal(matrix[1][0])

----
[3]==[0] : true : Equal
[3]!=[0] : false : Equal

[3]==[1] : true : Equal
[3]!=[1] : false : Equal

[3]==[2] : true : Equal
[3]!=[2] : false : Equal

[3]==[3] : true : Equal
[3]!=[3] : false : Equal

Class2:
----
[0]==[0] : true : Equal
[0]!=[0] : false : Equal

[0]==[1] : false : Not Equal(y)
[0]!=[1] : true : Not Equal(y)

[0]==[2] : false : Not Equal(z)
[0]!=[2] : true : Not Equal(z)

[0]==[3] : false : Not Equal(y)
[0]!=[3] : true : Not Equal(y)

----
[1]==[0] : false : Not Equal(y)
[1]!=[0] : true : Not Equal(y)

[1]==[1] : true : Equal
[1]!=[1] : false : Equal

[1]==[2] : false : Not Equal(y)
[1]!=[2] : true : Not Equal(y)

[1]==[3] : true : Equal
[1]!=[3] : false : Equal

----
[2]==[0] : false : Not Equal(z)
[2]!=[0] : true : Not Equal(z)

[2]==[1] : false : Not Equal(matrix[1][0])
[2]!=[1] : true : Not Equal(matrix[1][0])

[2]==[2] : true : Equal
[2]!=[2] : false : Equal

[2]==[3] : false : Not Equal(matrix[1][0])
[2]!=[3] : true : Not Equal(matrix[1][0])

----
[3]==[0] : true : Equal
[3]!=[0] : false : Equal

[3]==[1] : true : Equal
[3]!=[1] : false : Equal

[3]==[2] : false : Not Equal(z)
[3]!=[2] : true : Not Equal(z)

[3]==[3] : true : Equal
[3]!=[3] : false : Equal

添付ファイル: fileConstMethod.zip 135件 [詳細]

リロード   新規 下位ページ作成 編集 凍結 差分 添付 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: Thu, 22 May 2014 13:46:56 JST (1339d)