`не называет ошибку типа в С++
Я не знаю, что искать, чтобы найти объяснение для этого, поэтому я спрашиваю.
У меня есть этот код, который сообщает об ошибке:
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
Можете ли вы объяснить мне, почему?
EDIT:
Что касается ответа Ральфа Тандецки, вот мой полный код структуры. Не могли бы вы показать мне, как назначать значения так же, как и в моей структуре фрагмента?
struct Settings{
struct Dimensions{
int width;
int height;
} screen;
struct Build_menu:Dimensions{
int border_width;
} build_menu;
} settings;
Ответы
Ответ 1
Вы не можете назначать задания вне контекста функции на С++. Если вас озадачивает тот факт, что вы иногда видели символ =
, используемый вне контекста функции, например:
int x = 42; // <== THIS IS NOT AN ASSIGNMENT!
int main()
{
// ...
}
Это означает, что символ =
также может использоваться для инициализации. В вашем примере вы не инициализируете члены данных width
и height
, вы присваиваете им значение.
Ответ 2
В С++ 11 вы можете написать
struct Settings {
int width;
int height;
} settings = { 800, 600 };
чтобы исправить вашу ошибку. Ошибка появляется, потому что вы пытаетесь присвоить значение вне тела функции. Вы можете инициализировать, но не назначать глобальные данные вне функции.
EDIT:
Что касается вашего редактирования, просто напишите
Settings settings = {{800, 600}, {10, 20, 3}};
Я не уверен на 100%, если это работает, из-за наследования. Я бы рекомендовал избежать наследования в этом случае и записать Dimensions
как данные элемента в вашу структуру Build_menu
. Наследование рано или поздно даст вам всевозможные проблемы, когда будет использоваться таким образом. Предпочитаете композицию для наследования. Когда вы это сделаете, это будет выглядеть как
Settings settings = {{800, 600}, {{10, 20}, 3}};