Идиоматический способ установить определенный атрибут подкласса C++?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Идиоматический способ установить определенный атрибут подкласса C++?

Сообщение Anonymous »

Я пишу библиотеку с открытым исходным кодом для некоторой конкретной моделирования/расчета как часть отдельного проекта; Я только что переключился с Python на C ++, потому что Python оказался слишком медленным для целей проектов. Атрибут подкласса. В Python я бы не стал это < /p>

Код: Выделить всё

class BaseClass:

# ... base class methods ... #

class Subclass1(BaseClass):

myattr = 1

class Subclass2(BaseClass):

myattr = 2

# ...

mylist = [Subclass1(), Subclass2()]

# ...

foo(mylist[0].myattr) # works fine!
< /code>
Но C ++ более конкретно в печати и еще много чего. Желаемый результат заключается в том, что у меня может быть массив указателей BaseClass 
, а затем от любого из них, получить каким-то образом BaseClassPointerArray [Index]-> myAttr . C ++ не любит < /p>

Код: Выделить всё

class BaseClass {

public:

// ...

};

class Subclass: public BaseClass {

public:

myattr = 1;

};

// ...

BaseClass** ptrs = new BaseClass*[20];

// ...

foo(ptrs[1]->myattr); // throws an error at compile time because "myattr"
// is not an attribute of BaseClass, which is what
// is expected from the array after dereference

Код: Выделить всё

BaseClass
на самом деле никогда не используется в моем случае использования - только когда подклассы и другие методы BaseClass переопределяются подклассами - и BaseClass не имеет "четко определенного" значение для myattr, но все четко определенные подклассы нуждаются в значении myattr.
У меня были идеи о том, как добиться такого поведения: а) переопределение метода в базе класс, который возвращает константу, и б) настройку атрибута в базовом классе с помощью инициализатора. Они выглядят так:

Код: Выделить всё

// Case A: overriding a method

class BaseClass {

public:

// ...

virtual int myattr() { throw std::runtime_error("Use a Subclass!"); }

};

class Subclass: public BaseClass {

public:

// ...

int myattr() override { return 1; }

};

Код: Выделить всё

// Case B: setting an attribute in the base class and using an initializer

class BaseClass {

public:

int myattr;

BaseClass(int value) { myattr = value; }

// ...

};

class Subclass {

public:

Subclass(): BaseClass(1) {}

// ...

};
в стандартной практике C ++, какой из этих двух способов более идиоматический/просто -Ту>

Подробнее здесь: https://stackoverflow.com/questions/793 ... c-subclass
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»