Для начала я, вероятно, должен сообщить вам, что я ни в коем случае не программист, и я просто делаю это для домашнего задания, поэтому, если это возможно, мне потребуется действительно подробное объяснение 🙂
В настоящее время у меня есть класс Node, который я использую для хранения координат точек. Кроме того, я хочу назначить каждому отдельному объекту Node индексный номер на основе счетчика. Из того, что я собрал в Интернете, я делаю это с помощью другого класса, который инициализирует мой счетчик в конструкторе, а внутри класса Node я просто добавляю его в качестве статического параметра.
Это мой код для выше:
class counter
{
public:
int nr;
counter()
{
nr = 0;
}
};
class Nod
{
static counter ctr;
public:
int index;
Punct pct;
Nod(Punct &temp)
{
pct = temp;
index = ctr.nr ++ ;
}
Nod() {}
};
Теперь, это нормально, но как только я пытаюсь объявить объект Nod внутри моей основной функции, я получаю следующую ошибку: фатальная ошибка LNK1120: 1 неразрешенная внешняя сторона, и я абсолютно не понимаю, почему это так. Ранее я получал эту ошибку при попытке написать свой собственный деструктор, но я справился с этим, просто удалив этот бит кода.
Спасибо, и извините, если я использую неправильную терминологию для некоторых вещей, на которые я ссылался.
Статический член данных объявленный в классе, но это должно быть определенный ровно в одной единице перевода (= .cpp файл). Поместите следующее в один файл .cpp (желательно Nod.cpp):
counter Nod::ctr;
Кстати, вы могли бы просто использовать int
вместо пользовательского класса counter
,
Я тоже был против этого. Затем я прочитал статью Скотта Мейерса. Он рекомендовал статическую функцию, а не статическую переменную класса. Это означает, что вы объявляете и определяете переменную в одном месте. Следующие принты:
0 1 2 3 4 5 6 7 8 9
#include <iostream>
int next_index(void)
{
static int index = 0;
return index++;
}
int main(void)
{
for (int i = 0; i < 10; ++i) {
std::cout << next_index() << ' ';
}
}
В вашем случае вы бы поставили следующее:
Nod(Punct &temp)
{
pct = temp;
index = next_index();
}
Проблема в том, что Nod::ctr
только объявленный но нет определенный.
class Nod
{
// Declare the counter variable
static counter ctr;
...
};
// Define the counter variable
counter Nod::ctr;
определение конечно, должно быть в исходном файле, а не в заголовочном файле, или вместо этого вы получите несколько ошибок определения.
Исходя из описания вашей проблемы, решение гораздо проще.
Вы усложнили простой вопрос, просто используйте
class Nod
{
static int ctr;
public:
int index;
Nod()
{
ctr++; //Increment the counter every time a object is created
}
Nod() {}
};//Allocate memory also
int Nod::ctr;
Если имеется более одного типа конструктора, добавьте приращение счетчика в каждый конструктор.