1 Востаннє редагувалося Fox (30.04.2018 20:47:30)

Тема: g++ пише помилку через використання класу в .h

Маю я клас string:

.h
class string
{
    char* text;
    size_t size;
public:
    string(const char* text);
    ~string();
    size_t Lenght();
};
.cpp
string::string(const char* text)
{
    size = strlen(text);
    this->text = (char*)text;
}


string::~string()
{
}

size_t string::Lenght()
{
    return size;
}

I маю ще 2 файли (cpp, h).

.h
void print(string text);

.cpp
void print(string text)
{

}

Якщо видалити з .h файлу "void print(string text);" то помилок нема а як вiдновити то буде

Start builder
./Exmp/Exmp/stdlib
./Exmp/Exmp/stdlib.cpp: In function ‘io::POINT io::GetCursorPos()’:
./Exmp/Exmp/stdlib.cpp:29:10: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
   return { x, y };
          ^
./Exmp/Exmp/string
In file included from ./Exmp/Exmp/main.h:6:0,
                 from ./Exmp/Exmp/string.h:2,
                 from ./Exmp/Exmp/string.cpp:1:
./Exmp/Exmp/stdlib.h:4:12: error: variable or field ‘print’ declared void
 void print(string text);
            ^
./Exmp/Exmp/stdlib.h:4:12: error: ‘string’ was not declared in this scope
End build file

Перший раз працюю з g++... Help please
Може винен порядок компiлювання файлiв ?

Кхм...
G++ не розумiти pragma once ?
Трабл через пiдключеня iнклуду самого в себе скажiм так

2 Востаннє редагувалося koala (01.05.2018 07:26:00)

Re: g++ пише помилку через використання класу в .h

pragma once підтримується з gcc 3.4
Але тут є одна засаднича проблема: ви припускаєте, що проблема не в коді функцій і класів, а в include-ах та pragma-ах. Ви наводите той код, в якому, на вашу думку, немає проблем; це, в принципі, непогано. Але чому ж ви не наводите той код, в якому, на вашу думку, полягає проблема? Тут немає телепатів.

І варнінг виправіть теж.

3 Востаннє редагувалося Fox (01.05.2018 09:36:17)

Re: g++ пише помилку через використання класу в .h

koala написав:

pragma once підтримується з gcc 3.4
Але тут є одна засаднича проблема: ви припускаєте, що проблема не в коді функцій і класів, а в include-ах та pragma-ах. Ви наводите той код, в якому, на вашу думку, немає проблем; це, в принципі, непогано. Але чому ж ви не наводите той код, в якому, на вашу думку, полягає проблема? Тут немає телепатів.

І варнінг виправіть теж.

Та я виправив вже... Там було так, що
файл string.h пiдключений в stdlib.h а stdlib.h пiдключений в string.h...

А весь код не даю бо може знайтись умнiк який буде обсирати мене за те, що я пробую зробити.

4

Re: g++ пише помилку через використання класу в .h

Якщо вам треба зробити конструкцію

a.h:
include "b.h"
class A{/*робимо щось із класом B, скажімо*/ public: A(B b);}
a.cpp:
include "a.h"
/*реалізація класу A*/
A::A(B b){...}
b.h:
include "a.h"
class B{/*робимо щось із класом A, скажімо*/ public: B(A a);}
b.cpp:
include "b.h"
/*реалізація класу B*/
B::B(A a){...}

то вам треба видалити з a.h всі деталі про B і додати передпроголошення B, залишивши лише посилання на нього, (чи в b.h симетрично) а деталі вже робити в a.cpp:

a.h:
class B; //передвизначення - десь є такий клас B, деталі поки що невідомі
class A{/*робимо щось із класом B, скажімо*/ public: A(const B &b); /*тут нема ніякого B, тільки посилання*/}
a.cpp:
include "a.h"
include "b.h"
/*реалізація класу A*/
A::A(const B &b){...}
b.h:
class A;//передвизначення - десь є такий клас A, деталі поки що невідомі
class B{/*робимо щось із класом A, скажімо*/ public: B(const A& a);/*тут нема ніякого A, тільки посилання*/}
b.cpp:
include "a.h"
include "b.h"
/*реалізація класу B*/
B::B(const A& a){...}

include guards/pragma once додати за смаком.

Подякували: Fox, leofun012