Przypadkowe zadeklarowanie tej samej klasy w dwóch plikach cpp

0

Czy klasy o tej samej nazwie mogą istnieć w dwóch różnych plikach cpp ?

4p_cpp_error.zip

W dwóch plikach mam klasę która tak samo się nazywa MenuDescription różnica to jedno pole bool X

w zależności od kolejności kompilacji

tak
add_executable(menu0 main.cpp m1.cpp m2.cpp)
albo tak
add_executable(menu0 main.cpp m2.cpp m1.cpp)

nie ma wyjątku albo jest wyjatek

6

To jest naruszenie One Definition Rule i w tym wypadku program jest ill-formed
Definitions and ODR (One Definition Rule) - cppreference.com

One Definition Rule

....
There can be more than one definition in a program of each of the following: class type, enumeration type, inline function, inline variable (since C++17), templated entity (template or member of template, but not full template specialization), as long as all of the following is true:

  • each definition appears in a different translation unit
(since C++20)
  • each definition consists of the same sequence of tokens (typically, appears in the same header file)
    .....

If all these requirements are satisfied, the program behaves as if there is only one definition in the entire program. Otherwise, the program is ill-formed, no diagnostic required.

"each definition consists of the same sequence of tokens" - znaczy, że nawet jeśli jedyną róznicą jest inna nazwa pola lub funkcji to program i tak jest ill-formed.

2

Żona ci tego nie powie, a rządy ukrywają prawdę.

Namespace
Słowo autentycznie nieznane np arduinowcom

(tzn nie wiem w jakim kontekście zadałeś pytanie, jak to porzadnie ratować czy jak rozwijać)

0

@MarekR22 jak zawsze profesjonalna odpowiedz z linkami do pogłębiania wiedzy.

@ZrobieDobrze w sumie to nie ma co ratować, tutaj to problem edukacyjny ;)

3

@Marius.Maximus: To co kolega @ZrobieDobrze chciał przekazać swoim mało konkretnym wpisem to to, że jak włożysz te klasy do anonimowej przestrzeni nazw, to obydwie klasy będą mogły sobie istnieć mimo tej samej nazwy. Namespace może być też nazwany, z tym, że nazwy muszą się różnić pomięcy plikami .cpp.

W ogólności polecam wyrobić sobie odruch, że gdy tworzymy jakiś lokalny kod z przeznaczeniem dla jednego pliku .cpp to wrzucamy go do anonimowej przestrzeni nazw. Wysiłek żaden a oszczędza nam to bólu głowy później.

namespace {

class MyLocalHelper
{
  void muchHelp()
  {
  }
};

bool helperFunction
{
//....
}

} // namespace


bool APIClass::DoingWork() const
{
  MyLocalHelper helper{this};

  helper.muchHelp();
}

1
several napisał(a):

W ogólności polecam wyrobić sobie odruch, że gdy tworzymy jakiś lokalny kod z przeznaczeniem dla jednego pliku .cpp to wrzucamy go do anonimowej przestrzeni nazw. Wysiłek żaden a oszczędza nam to bólu głowy później.

A dlaczego anonimowej?
Nazwana powinna być naturalnym sposobem myślenia o projektowanej klasie, w zasadzie zawsze ma jakąś umysłową przynależność.

1
ZrobieDobrze napisał(a):
several napisał(a):

W ogólności polecam wyrobić sobie odruch, że gdy tworzymy jakiś lokalny kod z przeznaczeniem dla jednego pliku .cpp to wrzucamy go do anonimowej przestrzeni nazw. Wysiłek żaden a oszczędza nam to bólu głowy później.

A dlaczego anonimowej?

Z dokladnie tego samego powodu dla ktorego w rozsadnie napisanej klasie zmienne wykorzystywane wylacznie przez ta klase sa prywatne a nie publiczne.
A na poziomie plikow - z dokladnie tego samego powodu dla ktorego funkcje w C moga (i pewnie w wiekszosci przypadkow powinny) byc static.

0
eleventeen napisał(a):
ZrobieDobrze napisał(a):
several napisał(a):

W ogólności polecam wyrobić sobie odruch, że gdy tworzymy jakiś lokalny kod z przeznaczeniem dla jednego pliku .cpp to wrzucamy go do anonimowej przestrzeni nazw. Wysiłek żaden a oszczędza nam to bólu głowy później.

A dlaczego anonimowej?

Z dokladnie tego samego powodu dla ktorego w rozsadnie napisanej klasie zmienne wykorzystywane wylacznie przez ta klase sa prywatne a nie publiczne.
A na poziomie plikow - z dokladnie tego samego powodu dla ktorego funkcje w C moga (i pewnie w wiekszosci przypadkow powinny) byc static.

Dzięki za lekką złośliwośc.
Doczytałem, ten element C++ ma się odmiennie niż a'la odpowiedniki Java/C#

Tym niemniej podtrzymuję o nazwanej.
Zależnie jak klasa o przypadkowo zduplikowanej nazwie sie ma w projekcie, jest albo w ujęciu dziedzinowym (gui / data / model / config / utils, najgorsze te utils)

Albo, typowka Arduino, klasy mają nazwy chipów, a popularny chip to dziesiatki implementacji tzw "bibliotek" - ratujące by było w namespace wg autora / firmy. Ale nie jest, dwie klasy w głownej przestzreni nazw nazywają sie ABC1234

1 użytkowników online, w tym zalogowanych: 0, gości: 1