TrueValTableGenerator 意思就是真值表生成器。它的功能表示如下:
由 InputParser 知道,有三个变量,分别为 a, b, c。那么对应的直值表为

a

b

c

0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

如果 TrueValTableGenerator 能由一组变量生成其对应的真值表,就算完成了任务。这个类只需要一个生成真值表的函数就可以了。我给这个函数起名为 Generate。下面说一下这个函数的构造思想。

真值表的表示结构可以用一个 vector。因为真值表的长度(也就是上面表格的纵向长度 8)会随变量的数目变化而变化,所以用 vector 明显要比数组方便些。(事实上,我在写 C++ 和 .NET 程序时能用容器的地方都会用容器。数组有很多方面比不上容器。当然,如果你能保证你写的算法会比标准库更快的话数组会比容器快一些。)这个 vector 中的数据元素应该也是一个 vector。因为真值表的宽度也会变化(这里宽度就是变量的数目。即上面表格的横向长度 3)。为了方便,我把行 vector 重新定义了一个新的名字 Line:
typedef std::vector<int> Line;
这样函数的返回类型可以确定为 vector<Line>。我把这个结果放在函数内部定义的变量上:
vector<Line> result;


函数需要一个变量数组的参数,这个参数由类的成员提供。我把这个成员定义为:
std::vector<char> varNames;
这个成员由类的构造函数负责初始化。即由调用者负责传递这个数组参数。事实上,调用者会传递 InputParser.GetValNames() 的返回值。

注意到上面表格的每行 000, 001, 010, ... , 111 事实上是 0, 1, 2, ..., 7 的二进制表示。所以,只需要把 0-7 的二进制形式上的各个位塞进 result 里就行了。下面给出这个函数的完整实现代码:
vector<Line> TrueVarTblGenerator::Generate()
{
    vector
<Line> result;
    Line line;

    
for (int i = 0; i < powl(2this->varNames.size()); i++)
    {
        
for (int j = 0; j < varNames.size(); j++)
        {
            
int tmp = powl(2, j);
            tmp 
= tmp & i;
            tmp 
= tmp >> j;
            line.push_back(tmp);
        }
        result.push_back(line);
        line.clear();
    }
    
return result;
}

至此,这个类的主体就完工了。下面给出这个类的完整声明:
// TrueVarTblGenerator.h: interface for the TrueVarTblGenerator class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_TRUEVARTBLGENERATOR_H__B9541ABE_10AE_4D88_A830_3DD1CACDA9E3__INCLUDED_)
#define AFX_TRUEVARTBLGENERATOR_H__B9541ABE_10AE_4D88_A830_3DD1CACDA9E3__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include 
<vector>

typedef std::vector
<int> Line;

class TrueVarTblGenerator  
{
public:
    TrueVarTblGenerator(std::vector
<char>& varNames);
    
virtual ~TrueVarTblGenerator();

public:
    std::vector
<Line> Generate();

private:
    std::vector
<char> varNames;

};

#endif // !defined(AFX_TRUEVARTBLGENERATOR_H__B9541ABE_10AE_4D88_A830_3DD1CACDA9E3__INCLUDED_)