Могу ли я объявить и определить переменную статического класса в одном и том же файле .CPP?

В моем .cpp у меня есть объявление и определение класса. Возникают ошибки, когда я пытаюсь инициализировать массив строк, используя один из предложенных способов.

class week
{
public:
    week();
    static const char * const days[];
}

week::week()
{
 const char * const week::days = {"monday" , "tuesday" "etc..."}
}

Я получаю ошибку переопределения для допустимой переменной days. Но я хотел бы, какие изменения мне нужно будет внести в приведенный выше код, чтобы работать в том же файле .cpp.

Здесь я не использую заголовочный файл для объявления класса. И объявление класса, и его определение находятся в ОДНОМ и том же файле .cpp.

Спасибо


person user987316    schedule 26.09.2014    source источник


Ответы (4)


В файле C++ вы должны написать

const char * const week::days[] = {"monday", ...};
//                            ^^  <- don't forget these      

Он должен быть в глобальной области видимости, а не в конструкторе. Конструктор не должен иметь ничего общего с инициализацией статического члена.

person Armen Tsirunyan    schedule 26.09.2014

Вы захотите сделать что-то вроде этого:

class week
{
public:
    week();
    static const char * const days[];
};

week::week()
{

}

const char * const week::days[] = {"monday" , "tuesday", "etc..."};

void main()
{
    week w;
}

ОБНОВИТЬ:

Взгляните на несколько ошибок, которые я исправил:

  1. Добавлен ; в конце класса
  2. Инициализация статической переменной days перенесена вне класса, а также добавлен ; в оператор инициализации.

Статические переменные инициализируются в глобальной области видимости (после определения класса). Конструктор используется только для инициализации переменных-членов текущего экземпляра объекта.

Что касается вашего вопроса о размещении всего вашего кода в одном (.cpp) файле, ответ положительный. Вы можете поместить весь свой код в один файл и скомпилировать его, и он будет работать.
Однако это не рекомендуется.
По соглашению файлы заголовков (.h) содержат объявления, а (.cpp) — определения.

Итак, рефакторинг приведенного выше кода, я получаю следующие файлы с соответствующим кодом:

Файл: week.h

class week
{
public:
    week();
    static const char * const days[];
};

Файл: week.cc (или week.cpp)

#include "week.h"
const char * const week::days[] = {"monday" , "tuesday", "etc..."};

week::week()
{

}

Файл: main.cc (или main.cpp)

#include "week.h"
void main()
{
    week w;
}
person galdin    schedule 26.09.2014

Вам нужно объявить статический элемент данных вне функции класса.

eg:

class week
{
public:
    week();
    static const char * const days[];
};

char * week::days[] = {"monday" , "tuesday" "etc..."};

week::week()
{
}

Вы увидите ту же проблему, если разделите определение класса на файл заголовка (.h/.hpp).

person Simon Featherstone    schedule 26.09.2014
comment
Не объявить, а определить. (Объявление члена находится в определении класса.) - person molbdnilo; 26.09.2014

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

Когда вы делаете функцию встроенной, от компилятора зависит, выберет ли он ее для встроенной или нет по некоторым причинам оптимизации. Есть два способа объявления встроенных функций.

1) Implicit:-
Class Data
{
 public:
   void send()      
   {
   }
};
2) Explicit:-
class Data
{
  void send();
};
inline void Data::send()
{
}
person ravi    schedule 26.09.2014
comment
Как я могу определить их внутри класса? - person user987316; 26.09.2014
comment
Есть два способа: 1) Class X { void send() { } }; . Это неявно предполагается как встроенное (хотя зависит от компилятора). 2) класс X {}; inline void X::send() { } (Вы просите компилятор сделать его встроенным). - person ravi; 26.09.2014
comment
пожалуйста, помогите мне сделать это. - person user987316; 26.09.2014
comment
никогда не определяйте функции-члены в файле cpp Что? Кажется, вы предлагаете, чтобы весь код находился в заголовочных файлах. Вам придется защищать его. - person John Dibling; 26.09.2014
comment
это моя ошибка. прошу прощения. - person ravi; 28.09.2014