我正在为我的AVR cpu开发一个类。
该类将处理所有与端口相关的操作,如Set,Read等; 构造函数看起来像:
(...)
public:
Port(volatile uint8_t * DDR, volatile uint8_t * PORT);
(...)
它构建于main()
:
int main()
{
Port PortA(&DDRA, &PORTA);
(...)
}
现在我想确保构造具有相同参数的程序对象中的其他任何地方。我确定无法创建数组或映射来查找它并抛出异常。它必须在编译时完成。所以基本上我想强制avr-g ++检查当前项目中是否存在任何其他端口(相同的第一个参数或相同的第二个参数)。
所有函数都使用Port对象的指针/引用。
答案 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,但在所有其他编译单元中都是私有的,导致定义错误:无法访问私有成员函数。