#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. На самом деле я знал, что могу так поступить. Я просто хотел провести некоторый «эксперимент», чтобы лучше понять. Но спасибо, что уделили мне время.