2012-01-30 4 views
1

Я начал изучать классы, и теперь у меня возникла проблема. Я пытаюсь поставить все свои переменные в классе, но я получаю ошибки:C++ fstream в классе

main.cpp|6|error: expected identifier before string constant| 
main.cpp|6|error: expected ',' or '...' before string constant| 
main.cpp|7|error: expected identifier before string constant| 
main.cpp|7|error: expected ',' or '...' before string constant| 

Хотя, когда я делаю их глобальное все работает отлично

class Kauliukas{ 

     ifstream inFile("inFile.in"); 
     ofstream outFile("outFile.out"); 
     int n, akutes[100],k=0; 

     void ivedimas(); 
     void skaiciavimas(); 
     void isvedimas(); 
}; 

В чем проблема?

ответ

6

Инициализация идет в конструкторе. Это отличается от, например, C#. Вы должны определить конструктор как

class Kauliukas { 
public: 
    Kauliukas() : inFile("inFile.in"), outFile("outFile.out"), k(0) {} 
private: 
    ifstream inFile; 
    ofstream outFile; 
    int n, akutes[100],k; 

    void ivedimas(); 
    void skaiciavimas(); 
    void isvedimas(); 
}; 
+0

Да, это то, что я хотел :) Спасибо – RnD

+0

Кстати, я читала, что публичные переменные в классе является наихудшим, но как может Я обращаюсь к частным переменным в своей основной и определяю их? – RnD

+2

Обратите внимание, что в C++ 11 вы можете поместить инициализацию в определение класса, если выражение инициализации является константным выражением. http://www2.research.att.com/~bs/C++0xFAQ.html#member-init –

2

В предварительно-C++ 11 версии языка вы можете только объявить переменные внутри тела класса, вы не можете их инициализировать (ifstream inFile это заявление; ifstream inFile("infile.in") - это объявление и инициализация).

Вы должны сделать это так:

class Kauliukas 
{ 
    public: 
    Kauliukas(); 

    private: 
    ifstream inFile; 
}; 

Kauliukas::Kauliukas() // This is the constructor definition 
    : inFile("infile.in") // This is called an initialization list 
{ 
    // ... 
} 
+0

В стандартном C++ вы ** можете ** инициализировать членов в определении класса. Проверьте свою копию ISO 14882: 2011. Независимо от того, поддерживает ли этот стандарт этот стандарт, другой вопрос. –

+0

@ DietmarKühl У меня нет копии стандарта для проверки. Является ли раздел, который вы упомянули, также частью версий языка C++ версии 11? –

+1

Понятно, что нотация для инициализации члена в классе либо использует равную инициализацию (например, 'std :: ifstream in = std :: ifstream (" file ");' который также требует, чтобы класс был скопирован или перемещен конструктивно) или скобки инициализация (например, 'std :: ifstream в {" file "};'), то есть использование скобок не работает. Соответствующий раздел - это 9.2 [class.mem], пункт 5, который является новым в C++ 2011: это не было частью C++ 2003. Чтобы получить последние черновики стандарта, вы можете перейти на [страницу комитета] (http://www.open-std.org/JTC1/SC22/WG21/). –