Определите элемент переменной класса в файле cpp

#c

Вопрос:

Я пытаюсь объявить переменную члена класса в файле .h и определить ее в файле .cpp, но в VS2019 я получаю ошибку: «повторное объявление члена не разрешено». Примером моего кода является:

файл .h

 #include<iostream>
class test
{
  public:
    test();
    int a;
    static int v;
};
 

И файл .cpp является:

 #include"test.h"
int test::v = 231;    Here it works since v is static
int test::a = 12;     Here the problem..
test::test(){}
 

Комментарии:

1. Для этого вам понадобятся статические переменные-члены. Помните, что класс должен иметь более 1 экземпляра, поэтому невозможно обратиться к вашему a члену без экземпляра.

2. ОК. Итак, мне не разрешено определять его в файле cpp, если он не статичен? Я подумал, что с помощью оператора :: я мог бы связать переменную. Для функций, которые он выполняет, с этого момента мои рассуждения.

3. оператор :: Я мог бы связать переменную. Только статический элемент.

4. Вы можете инициализировать a в конструкторе test::test() : a{12} {}

5. Разница в том, что существует один экземпляр функции, но может быть более 1 экземпляра a элемента, и нет способа обратиться к ним, поэтому test::a это не работает.

Ответ №1:

Для нестатических членов вам понадобится экземпляр класса для изменения переменных. Например:

 // In the .cpp file
test test_1;
test_1.a = 1; // note that there is no need to include the type here

test test_2;
test_2.a = 2;

assert(test_1.a != test_2.a); // since they are two separate instances
 

Нестатические члены не нужно определять явно, как это делают статические члены.

Ответ №2:

Вы объявляете v переменной уровня класса, а a переменной экземпляра/объекта. Вы можете установить значение a по умолчанию с помощью конструктора.

Файл .h:

 #include<iostream>
class test
{
  public:
    test() a(12) {};
    test(int a_default) a(a_default) {};
    int a;
    static int v;
};
 

Файл .cpp:

 #include"test.h"
int test::v = 231; // works here, as v is static
test t1;   // works here, uses object/instance default
test t2 = test(12);   // works here, provides object/instance default
 

Комментарии:

1. Как я уже сказал Тонику, я просто проводил некоторый эксперимент, чтобы лучше понять. Я знаю «обычный способ» инициализации переменной. В любом случае спасибо за ваш любезный ответ.

Ответ №3:

Я думаю, что это, вероятно, то, чего ты хочешь:

 #include<iostream>
class test
{
  public:
    test();
    int a=12; // <<---
    static int v;
};
 

Комментарии:

1. На самом деле я знал, что могу так поступить. Я просто хотел провести некоторый «эксперимент», чтобы лучше понять. Но спасибо, что уделили мне время.