`C++

2013-06-05 7 views
12

'da bir" type "hatası vermiyor, bunun için bir açıklama bulmak için ne arayacağımı bilmiyorum, bu yüzden soruyorum.
hata raporları bu kodu vardır:`C++

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; 

ama ana değer atama koyarsanız, çalışır:

struct Settings{ 
    int width; 
    int height; 
} settings; 

main() { 
    settings.width = 800; // no error 
    settings.height = 600; // no error 

Beni bunun nedenini açıklar misin?

DÜZENLEME

: Ralph Tandetzky cevabı İlişkin
, burada benim tam yapı kodudur. Snippet yaprağımda yaptığınız gibi değerleri nasıl atadığınızı gösterir misiniz?

struct Settings{ 
    struct Dimensions{ 
     int width; 
     int height; 
    } screen; 

    struct Build_menu:Dimensions{ 
     int border_width; 
    } build_menu; 
} settings; 

cevap

24

Atamaları C++ işlevinde bir işlev bağlamında atamazsınız. = sembolü yanı başlatma için de kullanılabilir, çünkü var

int x = 42; // <== THIS IS NOT AN ASSIGNMENT! 

int main() 
{ 
    // ... 
} 

: Eğer bazen = sembolü gördü gerçeği ile şaşkın ediyorsanız gibi bir işlevi bağlamında dışında kullanılıyor. Örneğinizde, veri üyeleri width ve height başlatılamıyor, onlara bir değer ataıyorsunuz. C

+0

. hiç fark etmemişti. Burada eksik olan tek şey her zamanki std referansıdır. Andy'nin hesabına giren andy ya da başka bir adam mısın? :-) –

+1

Oh lanet olsun, harika. Başlatma özelliğini de kullanıyorum, bu yüzden bu yapının niçin çok daha fazla değişkene sahip olduğumdan bunun neden işe yaramadığını anlamadım. Net olmak gerekirse. int i = 5; 'çalışır, ama' int i; 'i takip ederek' i = 5; 'işe yaramaz mı? – Qwerty

+1

@Qwerty: Tam olarak –

8

Eğer hatayı düzeltmek için

struct Settings { 
    int width; 
    int height; 
} settings = { 800, 600 }; 

yazabilir 11 ++. Hata, bir işlev gövdesinin dışında bir değer atamaya çalıştığınız için görünür. İlk verileri bir işlev dışında atayabilir, atayamazsınız.

DÜZENLEME:

sadece bu çünkü mirasın olsa işe yararsa,% 100 emin değilim

Settings settings = {{800, 600}, {10, 20, 3}}; 

yazma, Düzenlemenizi ilgili. Bu durumda mirastan kaçınmanızı ve 'u Build_menu yapısına üye verileri olarak yazmanızı tavsiye ederim. Bu şekilde kullanıldığında, kalıtım er ya da geç her türlü problemi verecektir. Prefer composition to inheritance. Bunu yaptığınızda, bu kadar ince bir sorunla karşılaşacaksınız,

Settings settings = {{800, 600}, {{10, 20}, 3}}; 
+0

bunu da yazabiliriz 'struct Settings { int width = 10; int height = 20; } ayarları; –

+0

Oh, teşekkürler, bununla ilgili olarak başka bir sorum olacaktı. Gönderdiğim yapı, yalnızca gerçek yaprağımın bir parçasıydı. Sorumu güncelleyeceğim, çok naziksiniz ve bu atamayı kullanarak nasıl çalışabilirim? Benim ana.cpp başlığımda benim yapı tanımlamak (tabii ki içerir) böylece benim kodda görmek için ilk şey. Bu yüzden 300. satırda olan main() yerine böyle bir değer atama seti tercih ederim. – Qwerty

+0

@Qwerty bu sadece başlangıçtır. thses, bu üyelerin durumunu bilmeniz için yapınızı bir başlangıç ​​değerine ayarlar. Daha sonra programa uygun olarak değiştirebilirsiniz. \ –