Объявление классов внутри функций

242
10 мая 2017, 09:48

Можно ли объявлять классы внутри функций? А передавать созданные таким образом объекты в другие функции? Например, данный код выполняется, как задумано:

#include <iostream>
template <typename T>
void foo (T x)
{
    std::cout << x.a;
}
int main() {
    struct X {
        int a = 3;
    } x;
    foo(x);
}
Answer 1

В аналогичном вопросе на англоязычном StackOverflow отвечают, что объявлять локальные классы и структуры можно. Однако до C++11 их было нельзя использовать в качестве параметров шаблонов, зато можно, например, для реализации фабрики (пример из этого ответа, корректен в C++03):

// В .h
class Base
{
public:
    virtual ~Base() {}
    virtual void DoStuff() = 0;
};
Base* CreateBase( const Param& );
// В .cpp
Base* CreateBase( const Params& p )
{
    struct Impl: Base
    {
        virtual void DoStuff() { ... }
    };
    ...
    return new Impl;
}

Начиная с C++11 их можно использовать в том числе как параметры шаблонов, то есть с C++11 ваш пример тоже корректен.

Answer 2

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

#include <iostream>
template <typename T>
void foo2 (T x)
{
    std::cout << x.a;
}
template <typename T>
void foo (T x)
{
    std::cout << x.a;
    class m{
    public:
        int a = 2;    // объявляем класс внутри функции
    } g;
    foo2(g);          // передаем этот объект в другую функцию foo2()
}
int main(int argc, const char * argv[])
{
    class X{
    public:
        int a = 3;
    } x;
    foo(x);
    return 0;
}

Выводит 3 2
Но мне кажется, что так делать не корректно.

READ ALSO
Версия BIOS с помощью С++

Версия BIOS с помощью С++

Добрый день! Никак не удаётся написать или найти программу, которая позволяла бы выводить на экран версию BIOS текущего компьютераНужен код...

292
Запись в бинарный файл структуры

Запись в бинарный файл структуры

Доброго дняПо заданию требуется записать в бинарник несколько массивов структур

325
Почему не создаётся файл в с++

Почему не создаётся файл в с++

Не знаю почему но не создаётся файлПисал ofstream WAVf("newWAV

337
Запись в конец файла c++

Запись в конец файла c++

Здравствуйте, я сделал запись в файл с одного класса, но нужно дописать в этот же файл результаты из второго класса, результаты накладываются...

425