Статический конструктор в c ++ и фатальная ошибка LNK1120: 1 неразрешенная внешность

Для начала я, вероятно, должен сообщить вам, что я ни в коем случае не программист, и я просто делаю это для домашнего задания, поэтому, если это возможно, мне потребуется действительно подробное объяснение 🙂

В настоящее время у меня есть класс 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 неразрешенная внешняя сторона, и я абсолютно не понимаю, почему это так. Ранее я получал эту ошибку при попытке написать свой собственный деструктор, но я справился с этим, просто удалив этот бит кода.

Спасибо, и извините, если я использую неправильную терминологию для некоторых вещей, на которые я ссылался.

1

Решение

Статический член данных объявленный в классе, но это должно быть определенный ровно в одной единице перевода (= .cpp файл). Поместите следующее в один файл .cpp (желательно Nod.cpp):

counter Nod::ctr;

Кстати, вы могли бы просто использовать int вместо пользовательского класса counter,

2

Другие решения

Я тоже был против этого. Затем я прочитал статью Скотта Мейерса. Он рекомендовал статическую функцию, а не статическую переменную класса. Это означает, что вы объявляете и определяете переменную в одном месте. Следующие принты:

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();
}
2

Проблема в том, что Nod::ctr только объявленный но нет определенный.

class Nod
{
// Declare the counter variable
static counter ctr;

...
};

// Define the counter variable
counter Nod::ctr;

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

0

Исходя из описания вашей проблемы, решение гораздо проще.

Вы усложнили простой вопрос, просто используйте

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;

Если имеется более одного типа конструктора, добавьте приращение счетчика в каждый конструктор.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector