Это выглядело как простое определение класса и структуры, но получило ошибку компилятора из Visual Studio C ++ при объявлении экземпляра класса как члена структуры, но без проблем может объявить глобальные экземпляры того же класса. Ошибка компиляции в элементе структуры "Thing" (Thing thing1 (1, "1"))
Та же ошибка компиляции, если член класса объявлен как const и задан параметр в конструкторе const
class Thing
{
public:
Thing(int addr, char* str) : theaddr(addr), name(str) {}
void info() { printf("%d %s\n", theaddr, name); }
int read() { /* code to read */ }
void write(int newval) { /* code to write newval */ }
private:
int theaddr;
char *name;
};
Thing global_thing(0,"0"); // WORKS no problem
struct Things
{
Thing thing1(1,"1"); // ERROR on "Thing" members in struct
Thing thing2(2,"2");
.
.
.
Thing thingN(3,"3");
}specificThings;
Ошибка компилятора "ошибка C2059: синтаксическая ошибка:" константа "в элементах 'Thing' в определении структуры.
Приведенный выше пример класса Thing придуман, чтобы продемонстрировать проблему. Что я на самом деле пытаюсь сделать, так это объявить класс для доступа к устройству SPI с адресами регистра. Система имеет несколько устройств, и некоторые из них имеют общие имена регистров (например, «config»). Идея состояла в том, чтобы структура имела члены, которые являются экземплярами класса для установки фиксированных адресов регистров. Также я хочу использовать функцию типа «info ()» для печати имен связанных регистров в целях отладки.
Идея заключалась в том, чтобы сделать что-то вроде этого:
class DeviceReg
{
// content like the "Thing" class
};
struct
{
DeviceReg config(0x22,"config");
DeviceReg status(0x33,"status");
// and so on...
}rfdev;
Тогда доступ к устройству может быть таким:
rfdev.config.write(0x17);
rfdev.config.info();
, и может быть какое-то другое устройство, к которому можно получить доступ, например:
tempsensor.config.write(0x55);
tempsensor.info();
Таким образом, несколько устройств могут иметь конфигурацию или статусные регистры безвынужден называть каждый регистр конфигурации на основе устройства.
Поскольку то, что я хотел сделать, очевидно, нарушает синтаксис C ++, есть ли другой способ достичь желаемого результата?