2016-06-18 2 views
0

пытается увидеть, как структуры и конструкторы работают в заголовках, реализациях и основных файлах. Использование конструктора и конструктора по умолчанию. Я получаю ошибку компиляции в mains.cpp из «неопределенной ссылки на 'номер :: чисел()'определение конструктора в структуре

В test.h у меня есть:

#ifndef H_TEST 
#define H_TEST 

struct numbers{ 

    int a; 
    int b; 
numbers(); 

numbers(int x, int y); 

}; 
#endif 

В Numbers.cpp у меня есть:

#include "test.h" 

numbers::numbers() 
    { 
    a=0; 
    b=0; 
    } 
    numbers::numbers(int x, int y) 
    { 
     a=x; 
     b=y; 
    } 

в mains.cpp у меня есть:

#include<iostream> 
#include "test.h" 
using namespace std; 

numbers num;//compilation error occurs here 
int main() 

{ 





return 0; 
} 
+2

Наиболее вероятная причина в том, что вы не правильно связываетесь, вы связываете только «mains.cpp». –

+1

Возможная дубликация [Что такое неопределенная ссылка/неразрешенная ошибка внешнего символа и как ее исправить?] (Http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external- symbol-error-and-how-do-i-fix) – incBrain

+0

Он отлично работает в MSVS 2013. Какой из них вы использовали? –

ответ

3

Похоже, вы объявляете встроенные конструкторы в заголовочном файле, поставив в е (хотя и пустые тела функций) для конструкторов.

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

Попробуйте удалить пустые тела функций в заголовке.

+0

Он не компилируется, если я не добавил {}; в файлах заголовков. – Alex

+2

@Jane Это другая проблема. Вы должны отправить сообщение об ошибке, потому что пустое тело функции в заголовке неверно, если вы хотите определить тело функции в другом месте. –

3

Проблема в том, что вы строите по умолчанию num и не переназначаете его.

numbers num; // Constructs a numbers object with a = 0, b = 0 and stores it in num. 
int main() 
{ 
    numbers(3,5); // Constructs a numbers object with a = 3, b = 5. 
        // The object is discarded after the constructor call finishes. 

    cout<<num.a; // Prints a from the global variable num. 

    return 0; 
} 

Я думаю, что вы хотели, чтобы переназначить Номер:

numbers num; // num is default-constructed to a = 0, b = 0, as before. 
int main() 
{ 
    num = numbers(3,5); // num now holds a = 3, b = 5. 

    cout<<num.a; // Prints 3, as expected. 

    return 0; 
} 

сторона отмечает: Как правило, вы должны избегать неконстантная глобальных переменных. Кроме того, когда это возможно, инициализируйте переменные в той же строке, которую вы объявляете, чтобы они дважды не назначали членов данных (на самом деле это не так важно для очень маленьких объектов, подобных этому).

Редактировать: Я не заметил проблемы, о которой указал QuantumMechanic. Вы должны будете исправить обе ошибки, чтобы программа работала так, как вы ожидаете.

+0

Да, я получаю ошибки компиляции неопределенной ссылки на числа :: numbers() и числа (int, int) from main.cpp – Alex

+0

Вы упомянули, что используете Code :: Blocks. Вы добавили в проект Numbers.cpp? (Вероятно, это должно появиться в разделе «Источники».) –

+0

Да, это был исходный файл в моем проекте. В конце концов я смог его собрать. Я не знаю, почему этого не было раньше! – Alex

Смежные вопросы