Ошибки объявления статического вектора констант в файле .h и ошибки в определениях в файле .cpp - PullRequest
0 голосов
/ 07 октября 2019

Я просто пытаюсь добавить несколько статических векторов-констант в мой класс дат. Ошибки компилятора приведены ниже. Вот мой файл Date.h.

#include <vector>
#include <string>

class Date {
   private:
      int month;
      int day;
      int year;
      static const std::vector<std::string> monthNames(13);
      static const std::vector<int> daysInMonths(13);
   public:
      Date();
      Date(int month, int day, int year);
}

Теперь мой файл Date.cpp

#include "Date.h"
#include <vector>
#include <string>

const std::vector<std::string> Date::monthNames(13) {"","January","February","March","April","May",
      "June","July","August","September","October","November","December"};
const std::vector<int> Date::daysInMonths(13) {0,31,28,31,30,31,30,31,31,30,31,30,31};

Date::Date() : month(1), day(1), year(1900){
}

Date::Date(int month, int day, int year) : month(month), day(day), year(year) {
}

Мой компилятор g ++ выдает мне ошибки, которые я не могу расшифровать для моего объявления моих векторов в. h файл и для определений, которые я сделал в .cpp файле. Я не могу получить ошибки для форматирования здесь. Может кто-нибудь, пожалуйста, покажите мне, что я делаю не так?

1 Ответ

1 голос
/ 07 октября 2019

Вам не нужны (13) после объявлений / определений ваших двух std::vector объектов;на самом деле, вы не можете иметь их. В заголовке вам нужно только объявить векторы;в вашем исходном файле списки инициализатора сообщат компилятору, что эти векторы должны содержать.

Объяснение: Хотя вы можете иметь такой оператор, как const std::vector<int> dinMon(13), в качестве "автономного" кода (он создастуказанный вектор с 13 элементами), вы не можете сделать это в объявлении статического члена класса: это, в конце концов, только объявление. Таким образом, просто простой векторный тип - и тогда определение (в Data.cpp) должно совпадать, поэтому у вас там тоже не может быть (13).

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

Date.h:

class Date {
private:
    int month;
    int day;
    int year;
    static const std::vector<std::string> monthNames;
    static const std::vector<int> daysInMonths;
public:
    Date();
    Date(int month, int day, int year);
}; // You forgot the semicolon here!

Date.cpp:

#include "Date.h"
// #include <vector> // Don't need to re-include these, as they are already ...
// #include <string> // ... included by "Date.h"
const std::vector<std::string> Date::monthNames {
    "", "January", "February", "March", "April", "May",
    "June", "July", "August", "September", "October", "November", "December"
};
const std::vector<int> Date::daysInMonths { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

Date::Date() : month(1), day(1), year(1900) {
}

Date::Date(int month, int day, int year) : month(month), day(day), year(year) {
}
...