2013-05-02 5 views
2

мне было интересно, если кто-то может объяснить значение следующей ошибки:это неправильно вызвать метод за пределами основной()

КОД

#include "sstream" 

    std::stringstream h; 

    h.str(""); //clearing the stringstream object 

    int main() 

ОШИБКА

kial.cpp:5:1: error: ‘h’ does not name a type h.str("");

Также почему неправильно пытаться получить доступ к методу ouside для main()?

+3

потому что это не так, как работает C++. Поток программы определяется в основном. Все остальное является определяющим материалом, который может использовать основной (функции, глобальные переменные и т. Д.). – Dave

+1

Исключение из ответов - вы можете создать глобальный объект, конструктор которого будет вызываться. В этом случае вы вызываете конструктор как stringstream h (""). Однако строка string начинает пустую, поэтому это не требуется. –

+0

@NeilKirk Ум, немного опустив его, сэр? –

ответ

8

ОК, поэтому все приземлились здесь с простым заявлением, в котором говорится, что вы не можете этого сделать. Не доверять никому. На самом деле, вы можете. Но не так, как вы пытались это сделать. Как правило, вы не можете иметь такие выражения, как вызовы функций вне других функций. И первая функция для вызова называется всегда main. Однако C++ имеет RAII и глобальные объекты. Следовательно, существует только одно исключение из вышеприведенного правила - построение и уничтожение глобальных объектов. Используя RAII и объявив некоторый объект глобальным, вы можете вызвать его конструктор и сделать остальное оттуда. Так, например, вы могли бы решить проблему вам так:

#include <sstream> 
#include <iostream> // just for std::cout and std::endl. 

std::stringstream h; 

struct MyStruct { 
    MyStruct() { 
     h.str(""); //clearing the stringstream object 
     std::cout << "`h` string stream is cleared now!" << std::endl; 
    } 
}; 

MyStruct mystruct; 

int main() 
{ 
    std::cout << "I am called AFTER MyStruct's constructor" << std::endl; 
} 

компилировать и запускать:

$ g++ -Wall -pedantic -std=c++98 ./test.cc && ./test 
`h` string stream is cleared now! 
I am called AFTER MyStruct's constructor 

Надеется, что это помогает. Удачи!

+0

Я должен спросить, почему педантичный флаг? –

+3

@nerorevenge: Ах, только патологическая привычка, ничего серьезного. Так же, как увидеть все предупреждения, которые я могу получить, так что обычно бросайте педантичный, '-Wextra' и т. Д. – 2013-05-02 01:52:51

+1

Ну, я собираюсь сделать эту привычку сейчас. –

3

Компилятор предполагает, что вы попытались сделать объявление (или определение), поскольку общие утверждения не разрешены в глобальной области.

Короткий ответ на вопрос, почему это не допускается, заключается в том, что стандарт говорит об этом.

Чтобы понять, почему это ответ, подумайте, когда вы ожидаете, что код будет выполнен. Что означает вызов функции в глобальном (или пространстве имен) с учетом уже определенного порядка выполнения программы?

Если у вас действительно есть что-то, что вам нужно сделать в этой области, вы всегда можете использовать экземпляр класса, конструктор которого делает то, что вы хотите.

Смежные вопросы