Класс для использования в list

223
10 ноября 2018, 04:00

Есть два класса:

class ChangeButton
{
public:
    ChangeButton(string ButtonCode, int ButtonType)
    {
        btn_code = ButtonCode;
        btn_type = ButtonType;
    }
    std::string get_btn_code()
    {
        return btn_code;
    }
    int get_btn_type()
    {
        return btn_type;
    }
private:
    std::string btn_code;
    int btn_type;
};
class Change
{
public:
    Change(list<ChangeButton> Change_Button, list<ChangeButton> Change_To_Button)
    {
        change_btn_list = Change_Button;
        change_to_btn_list = Change_To_Button;
    }
    list<ChangeButton> get_list_change_btn()
    {
        return change_btn_list;
    }
    list<ChangeButton> get_list_change_to_btn()
    {
        return change_to_btn_list;
    }
private:
    list<ChangeButton> change_btn_list;
    list<ChangeButton> change_to_btn_list;
};

В коде мне необходимы:

list<Change> Changes;
list<ChangeButton> ChangeButtons;
list<ChangeButton> ChangeToButtons;

При компиляции проекта выскакивают многочисленные ошибки типа: Change необъявленный идентификатор, символ не является ни классом шаблон, ни функцией шаблон и т.п.

Я новичок в С++, поэтому делаю похоже как в С#.

В чём моя ошибка, подскажите пожалуйста. Буду благодарен, если покажете на примере.

// JsonReader.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include "rapidjson/istreamwrapper.h"
#include <iostream>
#include <string>
#include <fstream> 
#include <list>
using namespace rapidjson;
using namespace std;
int main()
{
        list<Change> Changes;
    list<ChangeButton> ChangeButtons;
    list<ChangeButton> ChangeToButtons;
    ifstream ifs("json.js");
    IStreamWrapper isw(ifs);
    Document documentFromFile;
    documentFromFile.ParseStream(isw);
    Value& arr = documentFromFile["changes"]; // open the "changes" tag
    if (arr.IsArray())
    {
        for (SizeType i = 0; i < arr.Size(); i++) // foreach the "changes" tag
        {
            Value& changes = arr[i];
            Value& change_btns = changes["change_btns"];
            if (change_btns.IsArray())
            {
                for (SizeType i = 0; i < change_btns.Size(); i++) // 
                {
                    Value& btn = arr[i];
                    cout << btn.GetType() << '\n';
                }
            }
        }
    }
    system("pause");
    return 0;
}
class ChangeButton
{
public:
    ChangeButton(string ButtonCode, int ButtonType)
    {
        btn_code = ButtonCode;
        btn_type = ButtonType;
    }
    std::string get_btn_code()
    {
        return btn_code;
    }
    int get_btn_type()
    {
        return btn_type;
    }
private:
    std::string btn_code;
    int btn_type;
};
class Change
{
public:
    Change(list<ChangeButton> Change_Button, list<ChangeButton> Change_To_Button)
    {
        change_btn_list = Change_Button;
        change_to_btn_list = Change_To_Button;
    }
    list<ChangeButton> get_list_change_btn()
    {
        return change_btn_list;
    }
    list<ChangeButton> get_list_change_to_btn()
    {
        return change_to_btn_list;
    }
private:
    list<ChangeButton> change_btn_list;
    list<ChangeButton> change_to_btn_list;
};
Answer 1

Классы нужно объявлять до момента использования. Функции и функции-члены можно объявлять предварительно, например так:

class Foo{
   int v;
public:
   Foo(int);
}
int main(){
 //....
}
Foo::Foo(int v){
    //...
}

Еще лучше вынести объявления в заголовочный файл.

Edit: Сами классы предварительно объявлять тоже можно, но при этом доступны только ссылки и указатели на них и запрещено их разыменование.

READ ALSO
Как применять координатные преобразования к региону в GDI+?

Как применять координатные преобразования к региону в GDI+?

В этой статье приведена следующая информация:

178
Как обезопасить приложение от патча?

Как обезопасить приложение от патча?

Есть приложение которое защищено проверкой подписи, но есть патч который подменяет оригинальную подпись -> она всегда вернаПатч изменяет...

168
java hibernate sequence

java hibernate sequence

Caused by: orgpostgresql

167