Неопределенная ссылка при компиляции C ++ - PullRequest
1 голос
/ 14 июля 2020

Мой код похож на этот, но проблема точно такая же: я получаю "неопределенную ссылку на` Test1 :: v "в Test1. cpp и в Test2. cpp при компиляции программа в VSCode. Что я делаю не так? Я немного новичок в C ++, поэтому я только что загрузил расширение, которое автоматически сделало меня проектом на C ++. Когда я запускаю программу с помощью Ctrl + Shift + B, я получаю эту ошибку, но когда я делаю это с расширением Code Runner, он не обнаруживает файлы. cpp.

// Test1.h
#include <iostream>
#include <vector>

using namespace std;

#ifndef TEST1_H
#define TEST1_H

class Test1{
    public:
        Test1();
        static vector<Test1> v;
        int a;

};

#endif
//Test1.cpp
#include "Test1.h"

Test1::Test1(){
    a = 2;
    v.push_back(*this);
}
//Test2.h
#include <iostream>
#include <vector>

using namespace std;

#ifndef TEST2_H
#define TEST2_H

class Test2{
    public:
        Test2();
        double var;
};

#endif
//Test2.cpp
#include "Test2.h"
#include "Test1.h"

Test2::Test2(){
    var = 5;
    Test1::v[0].a += var;
}
//main.cpp
#include <iostream>

#include "Test1.h"
#include "Test2.h"

using namespace std;

int main(int argc, char *argv[])
{
    cout << "Hello world!" << endl;
}

Ответы [ 2 ]

5 голосов
/ 14 июля 2020

У вас объявлено static vector в файле заголовка, но вам нужно определить его в файле cpp. Добавьте:

vector<Test1> Test1::v;

в ваш test1.cpp файл. Вы можете узнать больше о definition vs declaration здесь .

Также обязательно прочтите следующее: Почему «using namespace std;» считается плохой практикой?

1 голос
/ 14 июля 2020

Вы можете добавить имя класса для непосредственного вызова переменной, так как это c. Итак, вы можете сделать что-то вроде:

Test1::Test1(){
//  v.push__back(*this);       // previous
    Test1::v.push_back(*this); // now
}

in Test1.cpp. После этого вы получите справочную подсказку по вашему VS Code:

static std::vector<Test1> Test1::v

, которая доказывает, что это сделано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...