Если у вас есть:
class Product { ... };
class Agriculture : public Product { ...};
вы не можете избежать стандартного правила о том, что базовый объект строится до объекта производного. У вас нет шансов вмешаться в этот порядок и не устанавливать ничего в Product
до того, как начнется его конструктор.
Рекомендация:
Лучший дизайн для ваших потребностей будет предвидеть Product
конструктор, который принимает в качестве дополнительного параметра (ов) значение (ы), которые вы хотите установить:
class Product {
string origin;
public:
Product() : origin("tbd") { }
Product (string withorigin) { ...}
void setOrigin (string myorigin) { origin=myorigin; }
};
class Agriculture : public Product {
public:
Agriculture() : Product ("Earth") { ...}
};
Обходное решение:
Если такой дизайн не соответствует вашим потребностям, единственное, что вы могли себе представить, - это иметь статический mem в Product
. Тогда этот член будет независим от любого Product
и может быть установлен таким образом, чтобы объект был создан.
class Product {
static string defaultCurrency;
string currency;
public:
Product() : currency(defaultCurrency) { ... }
static void setDefaultCurrency (string cur) { defaultCurrency=cur; }
};
class Agriculture : public Product { ... };
int main() {
Product::setDefaultCurrency("EUR");
Agriculture a1;
}
Это больше подвержено ошибкам: результат строительства зависит от порядка операций, не связанных со строительством. Это может быть проблемой, например, в случае многопоточности, если несколько потоков строят объекты в тот же момент.
Нет, но вы можете изменить значение своего конструктора сельского хозяйства. Или рассмотрите возможность добавления параметров к конструктору Product, чтобы вы могли передать правильные начальные значения. – Buddy
Вопрос довольно неясен. Пожалуйста, проясните это с помощью соответствующего примера кодирования (другими словами, ** покажите свой код **). –
Конечно, вы можете. Используйте конструктор в Сельском хозяйстве, чтобы сделать соответствующие звонки родителям вашего продукта. –