Въпрос за C++

5 отговора 274 прегледа
#1

Въпрос за C++

Пиша някакви сорсове, който са разположени изцяло в хедер-файлове (няма .CPP). Всички хедери се обединяват от един (lib.h), и след това последния се include-ва в няколко .cpp-файла на проект. Проблема ми е следния:

1. Имам имплементирани функции и данни в хедера. Това ще доведе ли до създаване на копия на функциите и данните във всеки .cpp файл на проекта, който ги includv-вa и ако да (както предполагам), как да избегна това без да ползвам отделно .CPP за тях?

2. Подобно на първия въпрос, обаче по отношение на static methods на клас, които са имплементирани в хедера.

Т.е. има ли начин, да накарам компилатора да направи само по една инстанция от съответния код в хедера, без да пиша .cpp файл?

Отговор
в отговор на - #2

Re: Въпрос за C++

> Това ще доведе ли до създаване на копия на функциите и данните във всеки .cpp файл на проекта, който ги includv-вa
Da.
> как да избегна това без да ползвам отделно .CPP за тях?
Kato polzvash otdelno .CPP za tyah.
> 2. Подобно на първия въпрос, обаче по отношение на static methods на клас, които са имплементирани в хедера.
Podoben otgovor.
> Т.е. има ли начин, да накарам компилатора да направи само по една инстанция от съответния код в хедера, без да пиша .cpp файл?
T.e. nyama. Ako si podochul otnyakyde, che STL e napravena (pochti) samo s header-i - tova e syvsem drugo. Template-ite nyama i kak inache. V tozi sluchay ne se pravi samo po edna instanciya na syotvetniya kod ot header-a, a po mnogo (za vsichki vidove parametri na daden template).

Редактирано от Potencialen emigrant на

Отговор
в отговор на Potencialen emigrant #3

Re: Въпрос за C++

Благодаря ти, въпреки че не ми помогна особено.
Всъщност, намерих си решението и то е доста простичко...само трябваше да помисля малко .....и няма никакви .CPP-та

Отговор
в отговор на - #4

Re: Въпрос за C++

az neshto sym typ i ne se seshtam...
bi li publikuwal swoeto reshenie?

Отговор
в отговор на emo #5

Re: Въпрос за C++


//FILE1.H
#ifndef __FILE1_H
#define __FILE1_H

namespace test
{

static int A = 1; // no warnings
int B = 1; // warnings

int ta(int x)
{
A += x;
return A;
}

int tb(int x)
{
B += x;
return B;
}

}

using namespace test;
#endif

//FILE2.CPP
#include "File1.h"

int Test2A()
{
return ta(1);
}

int Test2B()
{
return tb(1);
}

//FILE3.CPP
#include "File1.h"

int Test3A()
{
return ta(1);
}

int Test3B()
{
return tb(1);
}

// MAIN.CPP
#include <stdio.h>
#include "File1.h"

extern int Test2A();
extern int Test3A();

extern int Test2B();
extern int Test3B();

int main(int, char*[])
{
printf("%d %d\r\n", Test2A(), Test3A());
printf("%d %d\r\n", Test2A(), Test3A());

printf("%d %d\r\n", Test2B(), Test3B());
printf("%d %d\r\n", Test2B(), Test3B());

/* OUTPUT IS:
3 2
5 4
3 2
5 4
*/
return 0;
}


//PROJECT
MAIN.CPP
FILE2.CPP
FILE3.CPP



Отговор
в отговор на - #6

Поправка...


#ifndef __FILE1_H
#define __FILE1_H

namespace test
{

static int A = 1;
static int B = 1;

inline int ta(int x)
{
A += x;
return A;
}

inline int tb(int x)
{
B += x;
return B;
}

}

using namespace test;
#endif


Отговор