检查编译时是否只有一个类实例

时间:2014-10-15 15:22:49

标签: c++ avr

我正在为我的AVR cpu开发一个类。

该类将处理所有与端口相关的操作,如Set,Read等; 构造函数看起来像:

(...)
public:
    Port(volatile uint8_t * DDR, volatile uint8_t * PORT);
(...)

它构建于main()

的开头
int main()
{
    Port PortA(&DDRA, &PORTA);
    (...)
}

现在我想确保构造具有相同参数的程序对象中的其他任何地方。我确定无法创建数组或映射来查找它并抛出异常。它必须在编译时完成。所以基本上我想强制avr-g ++检查当前项目中是否存在任何其他端口(相同的第一个参数或相同的第二个参数)。

所有函数都使用Port对象的指针/引用。

4 个答案:

答案 0 :(得分:2)

以下情况如何?

必须在编译时知道指针的地址。

template<int *p>
class Tester
{
public:
    static Tester& GetInstance()
    {
        static Tester t;
        return t;
    }

private:
    Tester() {}
};

int i;

int main()
{
    Tester<&i>& t = Tester<&i>::GetInstance();
}

答案 1 :(得分:0)

如果你只想要一个类的一个实例,那么为什么要使用类呢?类的整个目的是,您可以有多个intances。坚持全局变量和自由函数。

答案 2 :(得分:-1)

这不是很好,但它确实完成了工作。 10年的经验表明,嵌入式工作有时会像这样。 :/

我在MSVC下用一个简单的课程测试了这个,你必须适应你的需要,但它确实证明了这个原则。

在标题中声明你的类:

class t
{
public:
#ifdef ALLOW_CTOR
    t(int i);
    ~t();
#endif
    int get();

private:
    int m_i;
};

然后在一个文件中添加以下行:

#define ALLOW_CTOR 1

包含头文件,将端口实例声明为文件范围变量,然后实现类,ctor,dtor,访问器等的所有类方法。

如果您没有将ALLOW_CTOR行放在其他源文件中,他们仍然可以使用您班级中的访问者方法,但他们无法使用构造函数。在缺少正确的构造函数的情况下,MSVC会因为尝试使用默认的复制构造函数而抱怨,但由于参数列表不匹配,因此失败。我怀疑你使用的编译器会以某种方式失败,我只是不确定失败的确切原因。

答案 3 :(得分:-1)

@Neil Kirk

如果未能为编译单元提供ctor声明导致未定义的行为,那么有办法解决这个问题。

class t
{
#ifdef ALLOW_CTOR
public:
#else
private:
#endif
    t(int i);

public:
    ~t();
    int get();

private:
    int m_i;
};

将ctor标记为public,但在所有其他编译单元中都是私有的,导致定义错误:无法访问私有成员函数。