Я не знаю, что искать, чтобы найти объяснение этому, поэтому я спрашиваю.
У меня есть этот код, который сообщает об ошибке:
struct Settings{
int width;
int height;
} settings;
settings.width = 800; // 'settings' does not name a type error
settings.height = 600; // 'settings' does not name a type error
int main(){
cout << settings.width << " " << settings.height << endl;
но если я поставлю присвоение значения в main, это сработает:
struct Settings{
int width;
int height;
} settings;
main () {
settings.width = 800; // no error
settings.height = 600; // no error
Можете ли вы объяснить мне, почему?
РЕДАКТИРОВАТЬ:
Что касается ответа Ральфа Тандецкого, вот мой полный структурный код. Не могли бы вы показать мне, как назначить значения, как вы сделали с моей структурой фрагмента?
struct Settings{
struct Dimensions{
int width;
int height;
} screen;
struct Build_menu:Dimensions{
int border_width;
} build_menu;
} settings;
Вы не можете помещать назначения вне контекста функции в C ++. Если вы озадачены тем фактом, что вы иногда видели =
символ, используемый вне контекста функции, такой как:
int x = 42; // <== THIS IS NOT AN ASSIGNMENT!
int main()
{
// ...
}
Это потому что =
символ может быть использован для инициализация также. В вашем примере вы не инициализируете элементы данных width
а также height
, вы присваиваете им значение.
В C ++ 11 вы можете написать
struct Settings {
int width;
int height;
} settings = { 800, 600 };
для того, чтобы исправить вашу ошибку. Ошибка появляется, потому что вы пытаетесь присвоить значение вне тела функции. Вы можете инициализировать, но не назначать глобальные данные вне функции.
РЕДАКТИРОВАТЬ:
По поводу вашего редактирования, просто напишите
Settings settings = {{800, 600}, {10, 20, 3}};
Я не уверен на 100%, если это работает, хотя из-за наследства. Я бы рекомендовал в этом случае избежать наследования и написать Dimensions
как данные участника в ваш Build_menu
состав. Наследование рано или поздно доставит вам массу неприятностей, если использовать его таким образом. Предпочитаю композицию наследованию. Когда вы это сделаете, это будет выглядеть
Settings settings = {{800, 600}, {{10, 20}, 3}};