私は現在Qtで比較的小さなプロジェクトを作っています。プログラムの全期間を通じて利用できる2つのobject
と2 vector
があります。そのために、対応するヘッダーファイルで4つの宣言を行い、externとマークしてMainWindow.cpp
で定義しました。ここで初めて使用します。
ただし、実行時エラーstd::out_of_range
は、オブジェクトの1つが作成されているときに発生します。オブジェクトは作成されていません
MainWindow.cpp
#include "task.h" //Vectors; Works
#include "date.h" //Error
#include "db.h" //Works
std::vector<Task> task_vec; //extern from task.h
std::vector<Group> group_vec; //extern from task.h
Date date; //extern from date.h <- Error when instantinating this one
Database db; //extern from db.h
MainWindow::MainWindow(){//...}
//date and db objects are used in this file
date.cpp
#include "date.h" //it has "consants.h" included in it
//..Stuff
Date::Date()
{
//Use const int variable from "constants.h"
year = constants::START_YEAR; //Works, START_YEAR is initialized
year_count = constants::YEAR_COUNT //Works aswell
Month month(m, y);
}
Month::Month(int month, int year)
{
//Use const std::map<QString, std::pair<int,int>> from "constants.h"
day_count = constants::MONTH_DAY_MAP_LY.at(0).second //ERROR, MONTH_DAY_MAP_LY is not initialized
}
constants.h
:デバッグの長いセッションの後、私は最終的に、エラーの原因とソースを見つけましたnamespace constants {
const int START_YEAR = 2016;
const int YEAR_COUNT = 83;
const QList<QString> MONTH { "January", "February", "March",
"April", "May", "June", "July", "August", "September", "October", "November", "December"};
const std::map<QString, std::pair<int, int>> MONTH_DAY_MAP{
{MONTH[0], std::make_pair(0, 31)}, {MONTH[1], std::make_pair(1, 28)}, {MONTH[2], std::make_pair(2, 31)},
{MONTH[3], std::make_pair(3, 30)}, {MONTH[4], std::make_pair(4, 31)}, {MONTH[5], std::make_pair(5, 30)},
{MONTH[6], std::make_pair(6, 31)}, {MONTH[7], std::make_pair(7, 31)}, {MONTH[8], std::make_pair(8, 30)},
{MONTH[9], std::make_pair(9, 31)}, {MONTH[10], std::make_pair(10, 30)}, {MONTH[11], std::make_pair(11, 31)}
};
const std::map<QString, std::pair<int, int>> MONTH_DAY_MAP_LY {
{MONTH[0], std::make_pair(0, 31)}, {MONTH[1], std::make_pair(1, 29)}, {MONTH[2], std::make_pair(2, 31)},
{MONTH[3], std::make_pair(3, 30)}, {MONTH[4], std::make_pair(4, 31)}, {MONTH[5], std::make_pair(5, 30)},
{MONTH[6], std::make_pair(6, 31)}, {MONTH[7], std::make_pair(7, 31)}, {MONTH[8], std::make_pair(8, 30)},
{MONTH[9], std::make_pair(9, 31)}, {MONTH[10], std::make_pair(10, 30)}, {MONTH[11], std::make_pair(11, 31)}
};
}
なぜ私は考えていない。 START_YEAR
とYEAR_COUNT
が初期化されている場合は、ヘッダの残りの部分も同様に正しくなければなりません。私はEXTERNオブジェクトを宣言のはここ
です:
date.h
//...Stuff
class Date
{
public:
Date();
Year& operator[](int);
private:
std::array<Year, constants::YEAR_COUNT> date_arr;
} extern date;
私は、私はしばらくの間、このまわりで私の頭をラップすることができませんでしたけれども、私は、それを得たと思います。ご回答有難うございます! – 7Y3RPXK3ETDCNRDD
標準では次のようになります。 名前空間スコープのオブジェクトの動的初期化(8.5、9.4、12.1、12.6.1)がmainの最初の文の前に行われるかどうかは、実装定義です。初期化がmainの最初のステートメントの後のある時点に延期されている場合、初期化されるオブジェクトと同じ翻訳単位で定義された関数またはオブジェクトの最初の使用の前に行われます。 '' Constants.h "のオブジェクトは、' 'Data''コンストラクタ呼び出しの前に初期化されなければなりません。 – 7Y3RPXK3ETDCNRDD
"main()"の最初の文は "main()"を含む翻訳単位と同じではありません。さらに、これは「動的初期化」が 'main()'の前に出現する場合と出現しない場合があるが、異なる翻訳単位で宣言されたオブジェクトの動的初期化の相対的な初期化順序を指定するものではなく、 「初期化対象オブジェクトとしての翻訳単位」となる。 –