2016-11-17 3 views
-2

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

"A.hpp" 
class A; 

"A.cpp" 
class A 
{ 
    A() = default; 
    void method() { } 
}; 

, а не

"A.hpp" 
class A 
{ 
    A(); 
    void method(); 
}; 

"A.cpp" 
A::A() = default; 
void A::method() { } 

Это означает определение классов/структур в файле кода и включение только декларации в файлы заголовков.

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

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

Простое определение структуры/класса в файле заголовка приводит к проблемам с взаимно рекурсивными заголовочными файлами, если только они явно не помещают объявления в другой.

Я могу достичь этого стиля программирования на языке, подобном D, с помощью модульной системы, но как добиться этого на C++?

+0

Чтобы использовать класс, компилятор должен знать, какой переменный он содержит (чтобы определить его размер), и то, что член функции она (так что он может генерировать символы для ссылки). Следовательно, определение класса всегда должно быть видимым в любом файле, который фактически использует этот класс (т. Е. Практически ничего, кроме объявления указателя или ссылки на него). Хотя ваша идея является допустимым вариантом (хотя это может замедлить компиляцию и/или сделать определение класса грязным), вы делаете это неправильно, если поместить определение класса в исходный файл. –

+0

Модель компиляции C++ делает то, что вы пытаетесь сделать невозможным. – SergeyA

+0

Я голосую, чтобы закрыть этот вопрос как не по теме, потому что невозможно сделать то, что желает OP. – SergeyA

ответ

0

Что вы делаете, называется форвардной декларацией.

Вы не сможете ничего сделать (например, методы вызова, создавать экземпляры) с этим классом во всех других единицах перевода, кроме одного .cpp-файла, где вы его определяете. Таким образом, эта идея совершенно бесполезна и плоха. И вы получите ловушку ошибок компоновщика.

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

struct A { 
    A() {} // something 
    int func() { /* function body */ 
} 
+0

Думаю, вы неверно истолковали вопрос. Я понимаю технические причины, ПОЧЕМУ я не могу этого сделать, почему вопрос заключается в том, как я могу обойти это. – sprw121

+0

@ sprw121 нет способа сделать это, как вы хотите. Возможно, вы можете создать другой заголовок, поставить определение всего класса и включить его в исходный заголовок. Но это все еще уродливо – Starl1ght