#c
Вопрос:
Итак, у меня есть файл под названием test.cpp
class Entity
{
int c = 0;
int b = 0;
int d = 5;
};
А потом позвонил еще один main.cpp
#include<iostream>
#include<vector>
#include<algorithm>
class Entity
{
int a = 5;
int b = 0;
};
int main()
{
}
Почему эта ссылка и работает просто отлично? Разве компоновщик не видит, что существует 2 класса с одинаковыми именами и разными элементами данных? Также будут ли они рассматриваться как определения классов? Если бы я хотел объявить этот класс в заголовочном файле, я бы просто сделал то, что я сделал здесь, верно? Несмотря на то, что я технически определяю переменные, это все еще просто объявление класса, верно?..
Комментарии:
1. Классы на самом деле не существуют после того, как компилятор передал единицы преобразования компоновщику, только объекты.
2. С другой стороны, поскольку у вас есть разные определения класса в разных единицах перевода, ваша программа будет иметь неопределенное поведение .
3. Так что, я думаю, это считается определениями, но если я хочу создать класс из test.cpp как бы я это точно объявил в заголовочном файле?
4. Переместите полное определение из исходного файла в файл заголовка. Удалите определение во всех исходных файлах. Включите файл заголовка.
5. Но можно ли на самом деле указывать значения членов данных класса в объявлении? Потому что я чувствую, что если я это делаю, то это просто становится определением, например, если у меня есть класс class E { int a = 0; }; и просто поместите это в файл заголовка, это определение верно?
Ответ №1:
Это плохо сформированная программа.
Поскольку определение класса имеет внешнюю связь, то каждое определение класса должно состоять из одной и той же последовательности токенов.
С другой стороны, поскольку ни один код из единицы перевода test.cpp используется компоновщик, который может исключить его из конечного exe-файла.